天天看点

uboot分析之uboot启动内核分析

1.__u_boot_cmd_start以及__u_boot_cmd_end两个变量在代码只有一处出现,这两个变量是通过链接脚本传进来的。

2.使用nand read.jffs2中的.jffs2是因为使用这种格式不需要页对齐,比较方便。

3.flash上存储的内核:头部+真正的内核

头部中的两个重要的参数:

ih_load:表示加载地址,即内核运行时应该放在哪里

ih_ep:表示入口地址,运行内核时需要跳转到的地址

注释:因为头部有这两个参数,所以下载内核到内存中的位置没有关系,内核都会被移动到加载地址;加载的时候指的是真正的内核加载的地址,而不包括头部;头部大小为64字节。

4.使用do_bootm_linux启动系统:这时候uboot会帮助内核设置启动参数(内核和uboot之间的交互方法:在某个地址按某种格式(TAG格式)存放一些数据);跳转到入口地址去启动内核。

注释:跳到入口函数的过程:theKernel赋值;调用theKernel函数。

5.交互的参数:

setup_start_tag:size、tag、flag、pagesize、rootdev

setup_memory_tags:size、flag、size、start(0x3000 0000)

setup_commandline_tag:size、tag

setup_end_tag:0、0

6.theKernel函数的三个参数解析:

第一个参数为0

第二个参数:bd->bi_arch_number是机器ID(2410和2440的机器ID不同)。

第三个参数:bd->bi_boot_parasm是uboot和内核交互数据的首地址。

7.直接输入boot命令,实际上是调用bootcmd中的两条语句来启动内核。

继续阅读