Uboot 多种方式 (booti、bootm、bootz、bootefi) 引导不同的内核镜像【全】
不管用那种方法,只要能将 Linux 内核镜像和设备树文件存到 DRAM 中就行,然后使用 Uboot 命令用于启动镜像文件。只要不修改 bootcmd 中的内容,以后每次开机 uboot 倒计时结束以后都会存储设备拷贝 内核 和 dtb文件,然后启动 Linux。bootz 命令类似 bootm 命令 (三个参数依次是kernel地址、initrd地址、dtb地址),举例通过网络工具。booti
文章目录
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 中。可以从 EMMC
、 NAND
、U盘
和硬盘
等存储设备中将 Linux 镜像和设备树文件拷贝到 DRAM,也可以通过网络 nfs
或者 tftp
将 Linux 镜像文件和设备树文件下载到 DRAM 中。不管用那种方法,只要能将 Linux 内核镜像和设备树文件存到 DRAM 中就行,然后使用 Uboot 命令用于启动镜像文件。
3、bootm 命令
我们以 bootm 命令为例,引导 Uboot 自定义的内核镜像 (uImage
)。
bootm addr [initrd[:size]] [fdt]
其中:
参数 | 描述 |
---|---|
addr | kernel 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
谢谢点赞关注哈!
更多推荐
所有评论(0)