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

您所在的位置:网站首页 如何看镜像的文章格式 Uboot 多种方式 (booti、bootm、bootz、bootefi) 引导不同的内核镜像【全】

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

2024-07-10 04:42| 来源: 网络整理| 查看: 265

文章目录 1、Uboot 引导内核命令归纳2、Uboot 引导流程归纳3、bootm 命令4、booti 命令5、bootz 命令6、boot 命令7、Uboot如何运行Image.gz8、bootefi 命令

1、Uboot 引导内核命令归纳

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

命令描述内核镜像boot读取环境变量 bootcmd 来引导内核镜像booti引导 ARM64 内核镜像Imagebootm引导 u-boot自定义的内核镜像uImagebootz引导 ARM 内核镜像zImagebootefi引导 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]

其中:

参数描述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 服务器下载内核镜像到内存地址 0x91000000gunzip将内存地址 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

谢谢点赞关注哈!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3