uboot基础 -- 启动Linux kernel镜像之 booti 命令的用法

U-Boot booti 命令的作用与用法

booti 命令是 U-Boot 中用于引导 Linux 内核的命令,主要用于启动 ARM64 (AArch64) 平台上的内核映像。在现代嵌入式系统中,booti 通常用于启动设备上的 Linux 内核。

1. 基本概念

  • booti 命令用于引导内核时加载一个二进制的内核镜像 (Image),通常针对 ARM64 架构。
  • bootm 类似,booti 也用于启动内核,但是二者针对的镜像格式不同。
    • bootm 主要用于启动 uImage 格式的内核(一般由 mkimage 工具打包而成)。
    • booti 则用于加载 Linux 的原始内核镜像 (Image 文件)。

2. 命令格式

booti <kernel_addr> [initrd_addr [initrd_size]] [fdt_addr]

各参数的说明如下:

  • <kernel_addr>: 内核镜像在内存中的加载地址。通常是通过 load 命令或其他方式加载到内存中的位置。
  • [initrd_addr] [initrd_size] (可选): 可选的 initrd 地址和大小。如果提供了 initrd 地址和大小,那么它将会作为初始根文件系统,供内核在启动时使用。
  • [fdt_addr] (可选): 提供设备树(FDT,Flattened Device Tree)的地址。设备树描述了硬件布局,是启动现代 Linux 内核的必要信息。

3. 使用实例

以下是一个简单的使用例子,演示如何使用 booti 命令启动内核:

假设系统中有以下加载地址:

  • 内核镜像地址为 0x80000
  • initrd 地址为 0x1000000
  • 设备树地址为 0x2000000

可以使用如下命令来启动 Linux 内核:

booti 0x80000 0x1000000 0x2000000

这将引导 ARM64 平台上的内核,并使用 initrd 和设备树来进行系统初始化。

4. 使用步骤

在使用 booti 命令启动内核之前,通常需要进行以下步骤:

  1. 加载内核映像:将内核镜像加载到指定的内存地址。可以使用类似 load mmctftp 的命令将内核镜像从存储设备或网络加载到内存。例如:

    load mmc 0:1 0x80000 /boot/Image
    

    这会将存储在 /boot/Image 中的内核镜像加载到内存地址 0x80000

  2. 加载设备树(可选):设备树(FDT)用于描述硬件配置,可以用类似的方式加载到内存中,例如:

    load mmc 0:1 0x2000000 /boot/devicetree.dtb
    
  3. 加载 initrd(可选):initrd 是内核启动时的初始根文件系统,也需要加载到内存中。例如:

    load mmc 0:1 0x1000000 /boot/initrd.img
    
  4. 启动内核:完成内核镜像、设备树和 initrd 的加载后,使用 booti 命令启动内核:

    booti 0x80000 0x1000000 0x2000000
    

5. bootibootm 的区别

  • 镜像格式bootm 用于启动由 mkimage 生成的 uImage 格式镜像,而 booti 用于直接引导原始的 Linux 内核 Image
  • 架构booti 专门为 ARM64(AArch64)架构设计,适用于 64 位内核启动。而 bootm 适用于多种架构,包括 ARM32。

6. 注意事项

  • 内存地址:在使用 booti 命令时,确保加载内核、设备树和 initrd 的内存地址是正确且可用的,避免内存地址冲突。
  • 设备树的重要性:对于现代 ARM 系统,设备树是必须的,Linux 内核在启动时需要它来获取硬件布局信息。
  • 内核映像格式booti 只支持 Image 格式,不能用于 zImageuImage

7. 典型启动过程

U-Boot 引导 Linux 内核的典型过程如下:

  1. 设置引导环境变量,如内核和设备树的加载地址。
  2. 从存储设备加载内核、initrd 和设备树。
  3. 使用 booti 命令启动 Linux。

例如,可以通过定义环境变量和引导脚本来实现自动启动:

setenv kernel_addr_r 0x80000
setenv fdt_addr_r 0x2000000
setenv ramdisk_addr_r 0x1000000
setenv bootcmd 'load mmc 0:1 ${kernel_addr_r} /boot/Image; load mmc 0:1 ${fdt_addr_r} /boot/devicetree.dtb; load mmc 0:1 ${ramdisk_addr_r} /boot/initrd.img; booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r}'
saveenv

然后执行 boot 命令,就会按照定义的步骤自动引导内核。

8. 总结

booti 是 U-Boot 中用于引导 ARM64 平台的 Linux 内核的关键命令,主要用于直接加载和引导 Linux Image 格式的内核。正确使用 booti 需要确保内核镜像、initrd 和设备树的加载地址正确无误,且这些组件都已成功加载到内存中。

通过 booti 命令的灵活使用,可以在嵌入式设备上实现自动化引导过程,从而快速启动设备上的 Linux 系统。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值