u-boot如何启动内核

U-Boot启动内核详解
本文详细介绍了U-Boot如何启动内核的三个步骤:将内核搬移到DDR中,校验内核格式和CRC,以及传参并启动内核。讨论了zImage和uImage的区别,并解释了如何编译内核以及uboot启动内核时的参数传递机制。

内核启动的三个步骤

注:本次分析的u-boot是九鼎官方的u-boot代码
下载地址:链接:http://pan.baidu.com/s/1gfpDZqj 密码:7cqe


一 将内核搬移到DDR中
一个完整的软件+硬件的嵌入式系统,静止时(未上电时)bootloader、kernel、rootfs等必须的软件都以镜像的形式存储在启动介质中(X210中是iNand/SD卡);运行时都是在DDR内存中运行的,与存储介质无关。那么从静止状态到运行状态的过程就是启动过程。

1.运行时必须先加载到DDR中链接地址处
(1)uboot在第一阶段中进行重定位时将第二阶段(整个uboot镜像)加载到DDR的0xc3e00000地址处,这个地址就是uboot的链接地址。
(2)内核也有类似要求,uboot启动内核时将内存从SD卡读取放到DDR中(其实就是个重定位的过程),不能随意放置,必须放在内核的链接地址处,否则启动不起来。譬如我们使用的内核链接地址是0x30008000。

2.怎么获取静态内核镜像?

(1)SD卡/iNand/Nand/NorFlash等:raw分区
常规启动时各种镜像都在SD卡中,因此uboot只需要从SD卡的kernel分区去读取内核镜像到DDR中即可。读取要使用uboot的命令来读取(譬如X210的iNand版本是movi命令,X210的Nand版本就是Nand命令)
这种启动方式来加载ddr,使用命令:movi read kernel 30008000
其中kernel指的是uboot中的kernel分区(就是uboot中规定的SD卡中的一个区域范围,这个区域范围被设计来存放kernel镜像,就是所谓的kernel分区)

(2)tftp、nfs等网络下载方式从远端服务器获取镜像
uboot还支持

### U-Boot 启动内核的命令及相关使用方法 U-Boot 是一个功能强大的引导加载程序,用于初始化硬件并启动操作系统内核。在 U-Boot 中,启动内核的过程由特定的命令控制,这些命令通过 `U_BOOT_CMD` 宏定义,并且每个命令都有其特定的功能和用法。 #### 命令定义 U-Boot 的命令是通过 `U_BOOT_CMD` 宏来定义的,格式如下: ```c U_BOOT_CMD(name, maxargs, repeatable, command, "usage", "help") ``` 其中: - `name` 是命令的名称。 - `maxargs` 是命令支持的最大参数数量。 - `repeatable` 表示该命令是否可以重复执行。 - `command` 是指向实现该命令功能的函数指针。 - `"usage"` 是命令的简要用法说明。 - `"help"` 是更详细的帮助信息[^2]。 #### 启动内核的命令 U-Boot 中用于启动内核的主要命令是 `boot` 和 `bootm`。 1. **`boot` 命令** - 该命令是一个通用的启动命令,会根据配置自动选择合适的启动方式。 - 使用方法:直接输入 `boot` 即可触发默认的启动流程。 - 默认情况下,`boot` 命令会调用 `bootm` 命令来启动内核。 2. **`bootm` 命令** - `bootm` 是 U-Boot 中专门用于启动内核的命令。 - 使用方法: ```bash bootm <kernel_addr> [<initrd_addr> <fdt_addr>] ``` - `<kernel_addr>` 是内核镜像在内存中的地址。 - `<initrd_addr>` 是初始化 RAM 磁盘(initrd)的地址(可选)。 - `<fdt_addr>` 是设备树(Device Tree Blob, DTB)的地址(可选)[^1]。 3. **`go` 命令** - 该命令用于跳转到指定地址并开始执行代码。 - 使用方法: ```bash go <address> ``` - `<address>` 是要跳转的内存地址。 #### 示例代码 以下是一个典型的 U-Boot 启动内核的流程: ```bash # 加载内核到内存地址 0x80000000 tftp 0x80000000 uImage # 如果需要加载 initrd 和 dtb tftp 0x81000000 uInitrd tftp 0x82000000 uDtb # 启动内核 bootm 0x80000000 0x81000000 0x82000000 ``` #### 配置选项 在某些情况下,可能需要通过配置文件启用特定的启动介质支持。例如,启用从 SPI 闪存启动的支持可以通过以下配置实现: ```makefile # Boot media CONFIG_SPI_BOOT=y CONFIG_BOOTDELAY=3 ``` 上述配置表示启用了从 SPI 闪存启动的支持,并设置了 3 秒的启动延迟[^3]。 #### 注意事项 - 在使用 `bootm` 命令时,确保内核、initrd 和 DTB 的地址正确无误。 - 如果系统中没有 DTB 或 initrd,则可以省略对应的参数。 - 不同平台的 U-Boot 可能有不同的命令或扩展功能,具体请参考相关文档。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值