Linux系统镜像构建(1):uboot编译烧录与移植

1. Linux系统构成简单介绍

一个完整的linux系统,通常包含了Uboot、kernel、设备树以及根文件系统。

1.1. Uboot

U-Boot 是一个主要用于嵌入式系统的引导加载程序,可以支持多种不同的计算机系统结构,包括PPC、ARM、AVR32、MIPS、x86、68k、Nios与MicroBlaze。这也是一套在GNU通用公共许可证之下发布的自由软件。 Uboot的全称 Universal Boot Loader,是遵循GPL条款的开源项目, U-Boot的主要作用是用来启动操作系统内核,它分为两个阶段,即boot + loader, boot阶段启动系统,初始化硬件设备,建立内存空间映射图,将系统的软硬件带到一个合适的状态, loader阶段将操作系统内核文件加载至内存,之后跳转到内核所在地址运行。

另外,某些BootLoader可能含有一些高级特性,如校验操作系统镜像,从多个操作系统镜像中选择引导合适的操作系统, 或者添加网络功能,让系统自主从网上寻找合适的镜像并且进行引导等等。

未找到图片bootloader

1.2. Linux内核

Linux是一种开源电脑操作系统内核。它是一个用C语言写成,符合POSIX标准的类Unix操作系统。 Linux内核是一个用来和硬件打交道并为用户程序提供一个有限服务集的低级支撑软件。一个计算机系统是一个硬件和软件的共生体,它们互相依赖,不可分割。计算机的硬件,含有外围设备、处理器、内存、硬盘和其他的电子设备组成计算机的发动机。但是没有软件来操作和控制它,自身是不能工作的。完成这个控制工作的软件就称为操作系统,在Linux的术语中被称为“内核”,也可以称为“核心”。Linux内核的主要模块(或组件)分以下几个部分:进程管理子系统、内存管理子系统、文件子系统、网络子系统、设备子系统等。

未找到图片04|

1.3. 设备树

设备树是一种描述硬件的数据结构,它包含这些硬件设备的信息, 而这个文件,就是Device Tree(设备树),设备树包括设备树源码(Device Tree Source,DTS)文件、 设备树编译工具(Device Tree Compiler,DTC)与二进制格式设备树(Device Tree Blob,DTB), DTS包含的头文件格式为DTSI。

Uboot和Linux不能直接识别DTS文件, 而DTB可以被内核与BootLoader识别解析,通常在制作NAND Flash、SD Card启动镜像时, 通常会为DTB文件留下一部分存储区域以存储DTB,在BootLoader启动内核时,会先读取DTB到内存,再提供给内核使用。

未找到图片11|

1.4. 根文件系统

根文件系统(rootfs)是linux在初始化时加载的第一个文件系统, 根文件系统包括根目录和真实文件系统,它包含系统引导和使其他文件系统得以挂载(mount)所必要的文件。 根文件系统包含Linux启动时所必须的目录和关键性的文件,例如Linux启动时必要的初始化文件, 它在init目录下,此外根文件系统中还包括了许多的应用程序bin目录等, 任何包括这些Linux 系统启动所必须的文件都可以成为根文件系统。

在Linux内核启动的初始阶段,首先内核会初始化一个基于内存的文件系 统,如initramfs,initrd等,然后以只读的方式去加载根文件系统(load rootfs), 读取并且运行/sbin/init初始化文件,根据/etc/inittab配置文件完成系统的初始化工作 (提示:/sbin/init是一个二进制可执行文件,为系统的初始化程序,而/etc/inittab是它的配置文件), 在初始化的过程中,还会以读写的方式重新挂载根文件系统,在系统启动后, 根文件系统就可用于存储数据了,存在根文件系统是Linux启动时的必要条件。

我们常见的根文件系统制作工具有 buildroot、Ubuntu、Debian、yocto、busybox,这些工具的优缺点列出如下

未找到图片youquedian

2. Uboot的介绍

2.1. uboot简介

uboot是从FADSROM、8xxROM、PPCBOOT逐步发展演化而来的。uboot发展至今,已经可以实现非常多的功能, 在操作系统方面,它不仅支持嵌入式Linux系统的引导,还支持NetBSD,VxWorks, QNX, RTEMS, ARTOS, LynxOS, Android等嵌入式操作系统的引导。在CPU架构方面, uboot支持PowerPC、MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。

一般来说BootLoader必须提供系统上电时的初始化代码,在系统上电时初始化相关环境后, BootLoader需要引导完整的操作系统,然后将控制器交给操作系统。 简单来说BootLoader是一段小程序,它在系统上电时执行,通过这段小程序可以将硬件 设备进行初始化,如CPU、SDRAM、Flash、串口、网络等,初始化完毕后调用操作系统内核。

2.2. 启动uboot

以野火imx6ull 2020.10版本uboot为例,介绍uboot的使用, 在开发板上电uboot启动kernel之前按下键盘的空格或回车键, 进入uboot的命令模式。如下所示

uboot 2020.10-g4f79a1a2 (Feb 20 2021 - 11:25:18 +0800)

CPU:   Freescale i.MX6ULL rev1.1 792 MHz (running at 396 MHz)
CPU:   Industrial temperature grade (-40C to 105C) at 49C
Reset cause: WDOG
Model: Freescale i.MX6 UltraLiteLite 14x14 EVK Board
Board: MX6ULL 14x14 EVK
DRAM:  512 MiB
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
Loading Environment from MMC... OK
In:    serial
Out:   serial
Err:   serial
Net:   eth1: ethernet@20b4000 [PRIME]Could not get PHY for FEC0: addr 2

Hit any key to stop autoboot:  0
=>

可以看出uboot打印出了板子的一些基本信息,包括CPU、内存等信息。

2.3. uboot命令

当不清楚uboot支持什么命令时, 可输入 help 或 ? 可查看uboot支持的命令列表,如下所示

?         - alias for 'help'
base      - print or set address offset
bdinfo    - print Board Info structure
blkcache  - block cache diagnostics and control
bmode     - sd1|sd2|qspi1|normal|usb|sata|ecspi1:0|ecspi1:1|ecspi1:2|ecspi1:3|esdhc1|esdhc2|esdhc3|esdhc4
bmode - getprisec
boot      - boot default, i.e., run 'bootcmd'
bootd     - boot default, i.e., run 'bootcmd'
bootefi   - Boots an EFI payload from memory
bootelf   - Boot from an ELF image in memory
bootm     - boot application image from memory
bootp     - boot image via network using BOOTP/TFTP protocol
bootvx    - Boot vxWorks from an ELF image
bootz     - boot Linux zImage image from memory
clocks    - display clocks
cmp       - memory compare
coninfo   - print console devices and information
cp        - memory copy
crc32     - checksum calculation
dcache    - enable or disable data cache
dhcp      - boot image via network using DHCP/TFTP protocol
dm        - Driver model low level access
dtfile    - dtoverlay utility commands
echo      - echo args to console
editenv   - edit environment variable
env       - environment handling commands
erase     - erase FLASH memory
exit      - exit script
ext2load  - load binary file from a Ext2 filesystem
ext2ls    - list files in a directory (default /)
ext4load  - load binary file from a Ext4 filesystem
ext4ls    - list files in a directory (default /)
ext4size  - determine a file's size
ext4write - create a file in the root directory
false     - do nothing, unsuccessfully
fatinfo   - print information about filesystem
fatload   - load binary file from a dos filesystem
fatls     - list files in a directory (default /)
fatmkdir  - create a directory
fatrm     - delete a file
fatsize   - determine a file's size
fatwrite  - write file into a dos filesystem
fdt       - flattened device tree utility commands
flinfo    - print FLASH memory information
fstype    - Look up a filesystem type
fstypes   - List supported filesystem types
fuse      - Fuse sub-system
go        - start application at address 'addr'
gpio      - query and control gpio pins
help      - print command description/usage
i2c       - I2C sub-system
icache    - enable or disable instruction cache
iminfo    - print header information for application image
imxtract  - extract a part of a multi-image
itest     - return true/false on integer compare
ln        - Create a symbolic link
load      - load binary file from a filesystem
loadb     - load binary file over serial line (kermit mode)
loads     - load S-Record file over serial line
loadx     - load binary file over serial line (xmodem mode)
loady     - load binary file over serial line (ymodem mode)
loop      - infinite loop on address range
ls        - list files in a directory (default /)
md        - memory display
mm        - memory modify (auto-incrementing address)
mmc       - MMC sub system
mmcinfo   - display MMC info
mtest     - simple RAM read/write test
mw        - memory write (fill)
nfs       - boot image via network using NFS protocol
nm        - memory modify (constant address)
panic     - Panic with optional message
ping      - send ICMP ECHO_REQUEST to network host
pinmux    - show pin-controller muxing
printenv  - print environment variables
protect   - enable or disable FLASH write protection
random    - fill memory with random pattern
reset     - Perform RESET of the CPU
run       - run commands in an environment variable
save      - save file to a filesystem
saveenv   - save environment variables to persistent storage
setenv    - set environment variables
setexpr   - set environment variable as the result of eval expression
sf        - SPI flash sub-system
showvar   - print local hushshell variables
size      - determine a file's size
sleep     - delay execution for some time
source    - run script from memory
test      - minimal test like /bin/sh
tftpboot  - boot image via network using TFTP protocol
true      - do nothing, successfully
version   - print monitor, compiler and linker version

可看到uboot支持很多的命令,功能十分强大,与linux类似,在执行某条uboot命令时, 可使用 tab 自动补全命令,在没有命令名冲突的情况下可以使用命令的前几个字母作为命令的输入, 例如想要执行 reset 命令,输入 res 或 re 即可。

当需要具体使用哪个命令时,可使用 “help 命令” 或 “? 命令” 的方式查看具体命令的使用说明。以 “help printenv” 为例,

=> help printenv
printenv - print environment variables

Usage:
printenv [-a]
    - print [all] values of all environment variables
printenv name ...
    - print value of environment variable 'name'

可以看到printenv命令的说明以及使用方法。

关于uboot命令的使用可参考uboot官方链接: The U-Boot Documentation — Das U-Boot unknown version documentation 5.9. uboot Command Line Interface 部分。

2.3.1. uboot常见命令

uboot命令众多,下面介绍常用的uboot命令,详细的uboot命令使用方式请使用 help [命令] 查看。

常见命令

命令

说明

举例

help

列出当前uboot所有支持的命令

help [命令]

查看指定命令的帮助

help printenv

reset

重启uboot

printenv

打印所有环境参数的值

printenv [环境参数名]

查看指定的环境参数值

printenv bootdelay

setenv

设置/修改/删除环境参数的值

setenv bootdelay 3

saveenv

保存环境参数

ping

检测网络是否连通

ping 192.168.0.1

md

查看内存地址上的值

md.b 0x80000000 10

以字节查看0x80000000后0x10个数据

mw

用于修改内存地址上的值

mw.b 0x80000000 ff 10

以字节修改0x80000000后0x10个数据为ff

echo

打印信息,与linux下的echo类似

run

在执行某条环境参数命令

run bootcmd,执行bootcmd

bootz

在内存中引导内核启动

ls

查看文件系统中目录下的文件

load

从文件系统中加载二进制文件到内存

以上为用户较为常用使用的部分命令,具体的使用方式可使用 help [命令] 查看。

2.3.2. mmc命令

mmc命令能够对如sd卡以及emmc类的存储介质进行操作,以下进行简单说明, 对于mmc命令不熟悉可使用 help mmc 查看相关命令的帮助,常用功能如下所示

mmc命令功能

命令

说明

mmc list

查看板子上mmc设备

mmc dev

查看/切换当前默认mmc设备

mmc info

查看当前mmc设备信息

mmc part

查看当前mmc设备分区

mmc read

读取当前mmc设备数据

mmc write

写入当前mmc设备数据

mmc erase

擦除当前mmc设备数据

2.3.2.1. 查看mmc设备

使用 mmc list 查看板子上相关设备,本人使用的是emmc版本的开发板,并插入了sd卡, 可看到打印信息如下。

=> mmc list
FSL_SDHC: 0 (SD)
FSL_SDHC: 1

 使用 mmc dev 查看当前使用的mmc设备,打印信息如下,可看到当前设备为mmc0即sd卡。

=> mmc dev
switch to partitions #0, OK
mmc0 is current device

提示

可使用 mmc dev 1 命令切换当前设备为emmc设备

 使用 mmc info 查看当前使用的sd卡设备的信息。

=> mmc info
Device: FSL_SDHC
Manufacturer ID: 3
OEM: 5344
Name: SC16G
Bus Speed: 50000000
Mode: SD High Speed (50MHz)
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: 14.8 GiB
Bus Width: 4-bit
Erase Group Size: 512 Bytes
2.3.2.2. 查看分区信息

使用 mmc part 列出当前mmc设备分区

 => mmc part

 Partition Map for MMC device 0  --   Partition Type: DOS

 Part    Start Sector    Num Sectors     UUID            Type
 1     8192            81920           2ba51413-01     0e Boot
 2     90112           31026176        2ba51413-02     83
2.3.2.3. mmc操作

可使用以下指令对mmc存储介质以block为操作单位进行读、写、擦除操作,根据上面sd的信息可知, 一个block为512字节。

 mmc read addr blk# cnt    #读
 mmc write addr blk# cnt   #写
 mmc erase blk# cnt        #擦除

简单实例:将mmc设备的的前10个block读取到0x80000000地址处: mmc read 0x80000000 0 10

2.3.3. 文件系统操作命令

uboot能够对ext2/3/4以及fat文件系统设备进行访问, 可使用fstype命令判断存储介质分区使用的是什么类型的文件系统。 以mmc介质为例,判断sd的两个分区的文件系统类型

=> fstype mmc 0:1
fat
=> fstype mmc 0:2
ext4

野火linux开发板具有U盘功能,能够通过PC以访问U盘的形式访问/boot目录下的文件, /boot目录对应的即是 mmc 0:1 分区。

而ext4分区对应的则是Debian根文件系统。

知道了文件系统的类型即可使用相对应的命令对分区内容进行操作了。

2.3.3.1. FAT格式文件系统

uboot提供了能够对于FAT格式文件系统操作的各个指令, 如下所示,详细可通过 help [命令] 查看

FAT格式文件系统命令

命令

说明

fatinfo

打印关于文件系统的信息

fatls

查看存储设备的fat分区里的内容

fatload

从fat分区里读出文件到指定的内存地址

fatwrite

把内存上的数据存储到fat分区的一个文件里

fatmkdir

创建文件夹

fatrm

删除文件

2.3.3.1.1. 查看文件系统信息

使用fatinfo查看文件系统信息,打印信息如下

=> fatinfo mmc 0:1
Interface:  MMC
  Device 0: Vendor: Man 000003 Snr 6d8b9601 Rev: 1.0 Prod: SC16G▒
            Type: Removable Hard Disk
            Capacity: 15193.5 MB = 14.8 GB (31116288 x 512)
Filesystem: FAT16 "BOOT"
2.3.3.1.2. 查看分区下的文件目录

使用fatls查看分区下的文件目录,打印信息如下

 =>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值