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

devtools/2024/10/19 22:32:33/

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/devtools/127114.html

相关文章

嵌入式学习-IO进程-Day05

嵌入式学习-IO进程-Day05 线程函数接口 线程回收函数 获取线程号 线程同步 概念 线程同步机制 信号量 无名信号量 函数接口 互斥 互斥的概念 互斥锁 函数接口 死锁&#xff08;面试可能会问&#xff09; 条件变量 使用步骤 函数接口 进程间通信 Linux/Unix平台的通信方式发展 进…

基于SpringBoot+Vue+uniapp的在线招聘平台的详细设计和实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

JAVA队列

目录 1. 队列(Queue) 2.1 概念 2.2 队列的使用 ​编辑 ​编辑 后入后出 和栈类似 队列同样有 size&#xff08;&#xff09; 和 empty&#xff08;&#xff09;方法 2.3 队列模拟实现 3. 出队列 1. 队列(Queue) 1.1 概念 队列&#xff1a;只允许在一端进行插入数据…

【Vue进阶】第一章——熟悉Vue常用指令:从文本插值到表单绑定

目录 内容主要包含 1.Vue 常用指令介绍 目标 内容讲解 内容小结 2.文本插值v-html 目标 内容讲解 内容小结 3.绑定属性 v-bind:属性名或者 :属性名 (重点) 目标 内容讲解 内容小结 4.条件渲染v-if 目标 内容讲解 内容小结 5.条件渲染v-show 目标 内容讲解…

JavaWeb 19 AJAX

目录 一、什么是AJAX 同步交互和异步交互 同步交互 异步交互 Ajax工作原理 Ajax实现方式 原生JavaScript方式进行ajax(了解)&#xff1a; "我就是希望你好&#xff0c;就像很多人希望我好一样&#xff0c;特别简单&#xff0c;特别真挚。也不为了什么&#xff0c;就是希望…

CST软件超表面--- 偏振片- 线圆极化转换,Floquet端口,S参数算轴比AR

这期我们看一个超表面极化分析&#xff0c;用到Floquet端口模数&#xff0c;S参数读出极化和轴比&#xff0c;还有平面波散射截面等技巧。 使用模板&#xff0c;频率0-25GHz&#xff0c;电场监视器8.06GHz: 画一片PEC&#xff1a; 画第二片PEC&#xff0c;insert到第一片里面&…

ECU 安全启动和安全刷写的技术实现演示案例

场景: 诊断仪将新的应用程序软件下载到ECU中。 假设条件: ECU硬件支持CAN通信。ECU已安装Bootloader软件。诊断仪支持UDS协议和所需的诊断服务。应用程序软件已打包成HEX格式文件。 流程步骤: 预编程步骤: STP1_a: 切换扩展会话 诊断仪发送: $10 03 (功能寻址)ECU响应: $5…

网络空间安全之一个WH的超前沿全栈技术深入学习之路(一:渗透测试行业术语扫盲)作者——LJS

欢迎各位彦祖与热巴畅游本人专栏与博客 你的三连是我最大的动力 以下图片仅代表专栏特色 [点击箭头指向的专栏名即可闪现] 专栏跑道一 ➡️网络空间安全——全栈前沿技术持续深入学习 专栏跑道二➡️ 24 Network Security -LJS ​ ​ ​ 专栏跑道三 ➡️ MYSQL REDIS Advanc…