经过前两节的准备,我们现在可以开始肝u-boot的代码了
U-boot版本:2020/5/2
编译环境:Ubuntu 16.04
arm-none-eabi-gcc version 4.9.3 20150529 (prerelease) (15:4.9.3+svn231177-1)
运行环境:mini2440(s3c2440,arm920t)
代码仓库:[email protected]:JingyeLi/u-boot_2440.git
https://github.com/JingyeLi/u-boot_2440/tree/v0.1
u-boot.lds
这是一个很容易被人忽略的一个文件,包括我自己,以前一般用keil的时候都是自动生成的,但其实想要理解一个芯片的启动代码,最好先从lds文件开始(不过在此之前,希望你能对编译-链接-运行有所理解)。众所周知一个程序会分成对应的几段,而lds文件的用途就是规定好这几段会放在什么地方。
而lds的重点是开头的这几句,与程序入口密切相关,程序虽然还是从_start开始,但与老版的u-boot不同,新版的多了__image_copy_start和vectors,__image_copy_start我们放在后面relocate的时候一起理解,这里可以先忽略。
ENTRY(_start) /* 表明可执行文件代码从_start开始 */
SECTIONS
{
. = 0x00000000; /* 指定这个段从0x0开始*/
. = ALIGN(4); /* 4字节对齐,32位指令* /
.text : /* 具体TEXT段的结构 */
{
*(.__image_copy_start)
*(.vectors)
CPUDIR/start.o (.text*)
}
}