1、Uboot 引导内核命令归纳

Uboot 的本质工作是引导 Linux内核,针对不同的内核镜像,Uboot 提供了不同的 boot 指令,如下:

命令描述内核镜像
boot读取环境变量 bootcmd 来引导内核镜像
booti引导 ARM64 内核镜像Image
bootm引导 u-boot自定义的内核镜像uImage
bootz引导 ARM 内核镜像zImage
bootefi引导 ARM64 压缩内核镜像Image.gz

2、Uboot 引导流程归纳

要启动 Linux内核,需要先将 Linux 内核镜像文件拷贝到 DRAM 中,如果使用到设备树的话也需要将设备树拷贝到 DRAM 中。可以从 EMMCNANDU盘硬盘等存储设备中将 Linux 镜像和设备树文件拷贝到 DRAM,也可以通过网络 nfs 或者 tftp 将 Linux 镜像文件和设备树文件下载到 DRAM 中。不管用那种方法,只要能将 Linux 内核镜像和设备树文件存到 DRAM 中就行,然后使用 Uboot 命令用于启动镜像文件。

3、bootm 命令

我们以 bootm 命令为例,引导 Uboot 自定义的内核镜像 (uImage)。

bootm addr [initrd[:size]] [fdt]

其中:

参数描述
addrkernel Image文件所在的memory地址,必选
[initrd[:size]]initrd文件在memory中的地址位置和大小size,可以不指定,使用“-”代替即可
fdt设备树dtb文件在memory中的地址,在ARM64中,必选

执行 bootm 命令(三个参数依次是kernel地址、initrd地址、dtb地址),举例从EMMC中读取文件如下:

load mmc 0:1 $kernel_addr $kern_name
load mmc 0:1 $fdt_addr $fdt_name
bootm $kernel_addr - $fdt_addr

或者

load mmc 0:1 $kernel_addr $kern_name
load mmc 0:1 $fdt_addr $fdt_name
load mmc 0:1 $initrd_addr ramdisk.cpio.gz
bootm $kernel_addr $initrd_addr:$filesize $fdt_addr

4、booti 命令

booti 是 bootm 命令的一个子集,可用于执行位于内存中的ARM64 kernel Image(Image),其格式如下:

booti addr [initrd[:size]] [fdt]

booti 命令类似 bootm 命令 (三个参数依次是kernel地址、initrd地址、dtb地址),举例从USB中读取文件如下:

load usb 0:1 $kernel_addr $kern_name
load usb 0:1 $fdt_addr $fdt_name
booti $kernel_addr - $fdt_addr

或者

load usb 0:1 $kernel_addr $kern_name
load usb 0:1 $fdt_addr $fdt_name
load usb 0:1 $initrd_addr ramdisk.cpio.gz
booti $kernel_addr $initrd_addr:$filesize $fdt_addr

5、bootz 命令

bootz 命令用于启动 zImage 镜像文件, bootz 命令格式如下:

bootz addr [initrd[:size]] [fdt]

bootz 命令类似 bootm 命令 (三个参数依次是kernel地址、initrd地址、dtb地址),举例通过网络工具tftp传输文件如下:

tftpboot $kernel_addr $kern_name
tftpboot $fdt_addr $fdt_name
bootz $kernel_addr - $fdt_addr

或者

tftpboot $kernel_addr $kern_name
tftpboot $fdt_addr $fdt_name
tftpboot $initrd_addr ramdisk.cpio.gz
bootz $kernel_addr $initrd_addr:$filesize $fdt_addr

6、boot 命令

boot 命令也是用来启动 Linux 系统的,只是 boot 会读取环境变量 bootcmd 来启动 Linux 系统.
bootcmd 是一个很重要的环境变量!比如我们要想使用 tftp 命令从网络启动 Linux 那么就可以设置 bootcmd 如下,然后使用 saveenv 将 bootcmd 保存起来。然后直接输入 boot 命令即可从网络启动 Linux 系统。
命令举例如下:

setenv bootcmd 'load mmc 0:1 $kernel_addr Image; load mmc 0:1 $fdt_addr xxx.dtb; booti $kernel_addr - $fdt_addr'
saveenv
boot

前面说过,uboot 倒计时结束以后就会启动 Linux 系统,其实就是执行的 bootcmd 中的启动命令。只要不修改 bootcmd 中的内容,以后每次开机 uboot 倒计时结束以后都会存储设备拷贝 内核 和 dtb文件,然后启动 Linux。

7、Uboot如何运行Image.gz

在 UBoot 中,有两种方式会用到 Image.gz 文件,一是通过 bootefi 命令引导系统时,使用的内核镜像格式;二是通过 booti/bootm 命令引导系统时,使用 gzip 压缩的内核镜像,则需要使用 gunzip 命令进行解压缩。
以下是在 UBoot 中启动 gzip 压缩的内核镜像的示例命令:

tftp $kernel_gz_addr Image.gz
gunzip $kernel_gz_addr
bootm $kernel_addr

这些命令的作用分别是:

命令作用
tftp从 TFTP 服务器下载内核镜像到内存地址 0x91000000
gunzip将内存地址 0x91000000 处的压缩文件解压缩到内存中
bootm启动解压缩后的内核镜像,内核的起始地址为 0x90008000

需要注意的是:
在使用 gunzip 命令解压缩内核镜像时,需要确保解压后的内存地址不会与其他代码或数据冲突。否则可能会导致系统崩溃或无法正常启动。

8、bootefi 命令

然后使用 bootefi 命令来启动, bootefi 命令用于启动 Image.gz 镜像文件, bootefi 命令格式如下:

booti addr [initrd[:size]] [fdt]

执行 bootm 命令(三个参数依次是kernel地址、initrd地址、dtb地址),举例通过网络工具tftp传输文件如下:

load mmc 0:1 $kernel_addr EFI/BOOT/bootaa64.efi
load mmc 0:1 $fdt_addr xxx.dtb
bootefi $kernel_addr $fdt_addr

谢谢点赞关注哈!

Logo

更多推荐