Uboot 多种方式 (booti、bootm、bootz、bootefi) 引导不同的内核镜像【全】


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

谢谢点赞关注哈!

在U-Boot中,`bootz` 和 `bootm` 指令都是用于启动操作系统的命令,但是它们分别针对不同类型的内核镜像设计。 ### bootm `bootm` 命令主要用于启动压缩或未压缩的Linux Kernel镜像(通常是`.bin` 或 `.uImage` 格式)。它支持多种架构,并能够处理各种情况下的内核加载过程,例如解压、设置ATAG等。对于老版本的ARM Linux系统来说,使用的是ATAG机制传递启动参数给Kernel,此时我们会选择使用`bootm`。 语法示例: ``` bootm [addr [arg ...]] ``` 其中 addr 表示存放kernel映像的位置地址(一般位于RAM);如果需要传参,则可以继续添加后面的args部分表示额外附加信息如initrd位置及根文件系统所在等等内容。 ### bootz 而随着设备树(Device Tree Blob, DTB) 的引入,在较新的ARM平台下更倾向于采用device tree替代传统atags的方式描述硬件配置细节。于是有了专门适用于这种场景需求的新指令——即`bootz` 。该命令专为未经压缩的纯文本形式(zImage/xImage)以及与其关联联立使用的dtb文件准备而成。 语法结构类似于下面这样: ``` bootz zimage_addr [initrd_addr:initrd_size] [fdt_blob_addr] ``` 可以看到这里除了指定核心映象外还可以同时指明初始化ramdisk(initrd) 及其大小还有最终实际运行环境所依赖的具体板级描述符(devicetree blob). 总结起来说就是:`bootm` 更加通用一些, 它能适应更多种情形包括旧式的基于tags的数据交流模式; 而当面对现代化依靠devicetrees来表达部必要属性设定值之时则应优先考虑运用`bootz`.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鹅编程笔记

你的鼓励将是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值