U-Boot启动内核分析

U-Boot启动内核分析

先来引用一下这篇介绍“ARM Linux内核启动要求的文章ARM Linux Kernel 

Boot Requirements,是ARM Linux内核的维护者Russell King写的。  

 CPU register settings 

 o r0 = 0. 

 o r1 = machine type number.  

 o r2 = physical address of tagged list in system RAM.  ? CPU mode  

 o All forms of interrupts must be disabled (IRQs and FIQs.) 

 o The CPU must be in SVC mode. (A special exception exists for  ?Angel.)  

 Caches, MMUs  

o The MMU must be off.  

o Instruction cache may be on or off.  

o Data cache must be off and must not contain any stale data.  ? Devices  

o DMA to/from devices should be quiesced.  ? The boot loader is expected to call the kernel image by jumping directly to the first instruction of the kernel image. 

U-boot针对arm体系结构的CPUdo_bootm_linux()函数的实现就是在arch/arm/lib/bootm.c这个文件当中。

可以看到从arch/arm/lib/bootm.c中的第96 行开始就是do_bootm_linux()函数的实现。 

  

其中第101行声明了这样一个函数指针kernel_entry: 

void (*kernel_entry)(int zero, int arch, uint params); 

看看它的名字和参数的命名我们 也可以猜到这个其实就是内核的入口函数的指

针了。几个参数的命名也说明了上文提到的ARM Linux内核启动要求的第一条,

因为根据ACPSARM/Thumb Procedure Call Standard)的规定,这三个参数就是依次使用r0r1r2来传递的。 

  

接下来第123行就是给这个函数指针赋值: 

kernel_entry= (void (*)(int, int, uint))images->ep; 

可以看到kernel_entry被 赋值为images->ep,,即内核的入口点(Entry Point)。   

  

最后是对内核入口函数的调用,发生在第155行: 

kernel_entry(0, machid, bd->bi_boot_params); 

这里machid = bd->bi_arch_number

调用的时候对参数进行赋值,r0=0r1=bd->bi_arch_number

r2=bd->bi_boot_params,一个都不少。至此U-Boot的使命完成,开始进入ARM 

Linux地盘。  

### 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、付费专栏及课程。

余额充值