4.1分析start.S的第二阶段

4.1分析start.S的第二阶段

记住我们u-boot的目的:1.从FLASH读出内核,启动

4.1分析start.S的第二阶段

1.文件在u-boot-1.1.6\lib_arm\Board.c

4.1分析start.S的第二阶段

2.这里调用了 init_sequence序列,里面包含cpu初始化,单板初始化,中断,环境,串口,console(控制台)、显示,打印等

4.1分析start.S的第二阶段

3.但是这里好像不是FLASH读出内核,我们要找的是

支持读写,识别哪种FLASH

4.1分析start.S的第二阶段

跳回去继续往下看

4.这里是FLASH的初始化,以及识别NOR或者是NAND

4.1分析start.S的第二阶段

 

5.我们初始化了FLASH,继续往下看

这里是c库malloc的分配内存

4.1分析start.S的第二阶段

对应u-boot内存分配的

4.1分析start.S的第二阶段

6.往下,这里应该是读取nand识别

4.1分析start.S的第二阶段

我们有了这两个函数之后,现在u-boot有能力去读写Flash

 

4.1分析start.S的第二阶段

7.再下

4.1分析start.S的第二阶段

这里是我们在u-boot命令输出print后的环境变量的设置

我们想,环境变量应该是这样的,u-boot启动后应该是去u-boot上看看有没有环境变量,没有的话再以默认变量为环境变量

4.1分析start.S的第二阶段

8.往下是网卡的配置

到这里我们还没达到我们的目标:读内核和启动。

9.直到

4.1分析start.S的第二阶段

这是个循环,我们猜测可能是等待我们给u-boot输入什么命令,才去启动内核。

进去里面分析

 

我们看到有一个bootdelay想到我们的环境变量不是正好有吗,就是我们开发板上电后,串口显示的倒计时,如果没有按空格,就会启动内核,按下就进去u-boot命令端

4.1分析start.S的第二阶段

4.1分析start.S的第二阶段

到这里我自信了,觉得自己好像在怎么启动内核的大门打开了一大缝

10.往下,看到s = getenv ("bootcmd");,这个很重要,对应print的bootcmd=nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0

4.1分析start.S的第二阶段

看博客栏目内核文章1:启动内核过程详解

11.往下(关键)

有下面的代码分析:如果我们在bootdelay没有按下空格,就会执行run_command(s,0),其中s=getenv("bootcmd"),其实就是s=bootcmd=nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0

4.1分析start.S的第二阶段

如果按下了空格,就会执行s = getenv("menucmd");------进入u-boot命令界面

4.1分析start.S的第二阶段

往下是readline();读串口信息(我们输入的命令)

后面又是run_command();到这里我们知道u-boot的核心就是命令run_command()

4.1分析start.S的第二阶段

也就是执行s=getenv("bootcmd")。所以我们要分析

bootcmd=nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0也就是在我博客栏目内核文章1:启动内核过程详解