大家好。我最近在学习U-Boot(版本为2013-05),但是在分析源码的时候,有一个疑惑。
U-boot的两个阶段(生成MLO和u-boot.img)是公用一个start.S的,但是在start.S中有这样一段代码:
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
bl cpu_init_cp15
bl cpu_init_crit
#endif
而在include/configs/am335x_evm,.h中有这样的定义:
#ifndef CONFIG_SPL_BUILD
#define CONFIG_SKIP_LOWLEVEL_INIT
#endif
照理来说,cpu_init_cp15、 cpu_init_crit在第一阶段(SPL)会编译,而第二阶段不参与编译。
但是我编译成功后分别参考了spl下的u-boot-spl.map和顶层目录的u-boot.map(当然我这里是没指定O=的)
发现两个map文件都执行了cpu_init_cp15这个函数,我猜想可能在某个地方定义这个宏,但是我用egrep
找的时候没找到答案。主要是这个疑惑,希望了解的人可以解答一下,谢谢。
Yaoming Qin:
可以考虑用jtag跟下,看是不是真的运行了两遍
Jian Zhou:
回复 Yaoming Qin:
CONFIG_SPL_BUILD这个宏在编译SPL的时候define了,可以参考uboot/spl/目录下的makefile。
而在编译u-boot的时候,CONFIG_SPL_BUILD这个宏没有define,在am335x_evm.h中就会define CONFIG_SKIP_LOWLEVEL_INIT,因此对于U-boot,start.s中的这段代码:
#ifndef CONFIG_SKIP_LOWLEVEL_INIT bl cpu_init_cp15 bl cpu_init_crit#endif
表明在u-boot下cpu_init_cp15()和cpu_init_crit()这两个函数都不会被调用执行。
simon yao:
回复 Jian Zhou:
谢谢回复。我本来也是这样想的,但是看编译好的u-boot.map中确实编译了cpu_init_cp15这个函数,这也是我不解的。顺道问一下U-Boot进入board_init_r进行各个初始化之后,最后调用main_loop(),但是在main_loop()实现中我一直找不到引导内核的函数?能否告知下?谢谢。
Yaoming Qin:
回复 simon yao:
编译了不等于运行了。
关于uboot,我建议可以一边读代码,一边参考 http://www.deyisupport.com/question_answer/dsp_arm/sitara_arm/f/25/t/16735.aspx 进行调试看看。
simon yao:
回复 Yaoming Qin:
你好,谢谢回复。.map文件不是根据.bin或者.img生成的吗?当我们执行这两者的时候,不是就执行了吗?可能我对这个的认识是错的。这份文档我之前看过了,但
是我手上也没有JTAG,学生仔。对了,我又衍生了一个问题。我看了am335x的数据手册第26章初始化这一章,当系统上电的时候(我的开发板是从eMMC或SD启
动),会先执行ROM的代码,而ROM会拷贝MLO到内部的SRAM执行, 手册说image header(这里指MLO吧)会说明拷贝到哪以及拷贝镜像的大小,我也看到了,
比如该头部会说明下载到哪个地址,比如0x402F_0400,还有image大小,这里我就有一个疑惑,是只拷贝MLO,还拷贝MLO和u-boot.img一部分(两个都拷贝肯
定不行,SRAM没那么大),这个拷贝大小是在链接文件里说明的吗,请问是哪个链接文件?
TI中文支持网
