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

ops/2024/10/15 9:07:49/

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 系统。


http://www.ppmy.cn/ops/125862.html

相关文章

【VUE】Vue的diff算法和React的diff算法

React和Vue都使用了虚拟DOM来进行高效的页面更新&#xff0c;但它们在实现细节上有一些差异。下面是React和Vue的diff算法的异同点&#xff1a; 异同点&#xff1a; 目标&#xff1a;React和Vue的diff算法的目标都是尽量减少DOM操作的次数&#xff0c;提高页面更新的性能。虚…

初试PostgreSQL数据库

文章目录 一、PostgreSQL数据库概述1.1 PostgreSQL的历史1.2 PostgreSQL安装1.3 安装PostgreSQL二、PostgreSQL起步2.1 连接数据库2.1.1 SQL Shell2.1.2 执行SQL语句2.2 pgAdmin 42.2.1 打开pgAdmin 42.2.2 查找数据库2.2.3 打开查询工具2.2.4 执行SQL语句三、实战小结文章目录…

深入理解链表(SList)操作

目录&#xff1a; 一、 链表介绍1.1、 为什么引入链表1.2、 链表的概念及结构1.3、 链表的分类 二、 无头单向非[循环链表](https://so.csdn.net/so/search?q循环链表&spm1001.2101.3001.7020)的实现2.1、 [单链表](https://so.csdn.net/so/search?q单链表&spm1001.2…

SDV 峰会聚焦:下一代软件定义汽车的关键开源技术

10 月 17 - 18 日&#xff0c;由 GOSIM 开源创新汇主办、CSDN 承办的 GOSIM CHINA 2024 将在北京盛大启幕。作为 GOSIM 开源年度大会的第三届盛会&#xff0c;本次活动邀请了 60 多位国际开源专家&#xff0c;汇聚了来自全球百余家顶尖科技企业、知名高校及开源社区的技术大咖、…

docker环境redis启动失败

现象&#xff1a; 查看日志错误为 Bad file format reading the append only file: make a backup of your AOF file, then use ./redis-check-aof --fix <filename> 经查询为aof文件损坏导致&#xff0c;修复aof即可 解决方法&#xff1a; 1.查看执行的docker命令&…

【Python爬虫实战】正则:多字符匹配、开头与结尾定位、分组技术详解

&#x1f308;个人主页&#xff1a;https://blog.csdn.net/2401_86688088?typeblog &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、匹配多个字符 &#xff08;一&#xff09;匹配任意多个字符 &#xff0…

buffer/cache内存优化_posix_fadvise_主动释放读缓存cache

1.问题现象 1.htop free命令发现系统 buffer/cache 内存占用高 free -h total used free shared buff/cache available Mem: 61Gi 15Gi 569Mi 1.7Gi 45Gi 43Gi Swap: 30Gi 0.0Ki 30Gi cat /proc/meminfo or grep -E "Buff|Cache" /proc/meminfo Buffers: 370568 kB …

Postman最新V11版本关键更新一览

Postman作为接口测试中&#xff0c;被广泛应用的一款主流工具&#xff0c;以其丰富的功能&#xff0c;灵活方便的使用方式&#xff0c;广受欢迎。最新发布的V11版本则在向协作平台转型的过程中一路狂奔&#xff0c;增加大量全新的协作支持。下面我们就一起来看看都有哪些变化吧…