4.1分析start.S的第二阶段

本文详细解析了U-Boot启动过程中的关键步骤,包括FLASH初始化、环境变量设置、网卡配置及内核启动条件。特别关注了bootcmd环境变量如何控制内核启动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记住我们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:启动内核过程详解

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值