4.1分析start.S的第二阶段
记住我们u-boot的目的:1.从FLASH读出内核,启动
1.文件在u-boot-1.1.6\lib_arm\Board.c
2.这里调用了 init_sequence序列,里面包含cpu初始化,单板初始化,中断,环境,串口,console(控制台)、显示,打印等
3.但是这里好像不是FLASH读出内核,我们要找的是
支持读写,识别哪种FLASH
跳回去继续往下看
4.这里是FLASH的初始化,以及识别NOR或者是NAND
5.我们初始化了FLASH,继续往下看
这里是c库malloc的分配内存
对应u-boot内存分配的
6.往下,这里应该是读取nand识别
我们有了这两个函数之后,现在u-boot有能力去读写Flash
7.再下
这里是我们在u-boot命令输出print后的环境变量的设置
我们想,环境变量应该是这样的,u-boot启动后应该是去u-boot上看看有没有环境变量,没有的话再以默认变量为环境变量
8.往下是网卡的配置
到这里我们还没达到我们的目标:读内核和启动。
9.直到
这是个循环,我们猜测可能是等待我们给u-boot输入什么命令,才去启动内核。
进去里面分析
我们看到有一个bootdelay想到我们的环境变量不是正好有吗,就是我们开发板上电后,串口显示的倒计时,如果没有按空格,就会启动内核,按下就进去u-boot命令端
到这里我自信了,觉得自己好像在怎么启动内核的大门打开了一大缝
10.往下,看到s = getenv ("bootcmd");,这个很重要,对应print的bootcmd=nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0
看博客栏目内核文章1:启动内核过程详解
11.往下(关键)
有下面的代码分析:如果我们在bootdelay没有按下空格,就会执行run_command(s,0),其中s=getenv("bootcmd"),其实就是s=bootcmd=nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0
如果按下了空格,就会执行s = getenv("menucmd");------进入u-boot命令界面
往下是readline();读串口信息(我们输入的命令)
后面又是run_command();到这里我们知道u-boot的核心就是命令run_command()
也就是执行s=getenv("bootcmd")。所以我们要分析
bootcmd=nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0也就是在我博客栏目内核文章1:启动内核过程详解