由于开始串口没有出内容,因此对u-boot入口产生怀疑.在网上也找到一个帖子,碰到同样疑问的人: http://www./forum/showflat.php?Cat=&Board=embedded&Number=563322&page=0&view=collapsed&sb=5&o=0&fpart= "链接得到的起始地址为什么是TEXT_BASE,而不是0呢,所以现在只能够下载到ram中运行,但是无法烧写道flash中跑,这是怎么回事呢?u-boot中应该是start.S中的这段代码在flash中运行吧,后面就把自身拷贝到ram中TEXT_BASE地址处,为什么在链接文件中指定的_start的起始地址为0x00000000呢? " 后来我理解了: “链接得到的起始地址为什么是TEXT_BASE,而不是0呢,” 因为u_boot如果从flash运行的话,那么它会将自己的代码拷贝到RAM中,然后运行。u-boot开始部分代码与编译的入口没有关系,而主要的代码是在RAM中运行,因此编译的入口地址是TEXT_BASE.因此u-boot既可以flash运行,也可以ram运行。 “为什么在链接文件中指定的_start的起始地址为0x00000000呢?” lds文件中的起始地址为0x00000000是不起作用的,由-TTEXT_BASE参数替代的。 刚开始比较疑惑的原因是对: 126 relocate: /* relocate U-Boot to RAM */ 127 adr r0, _start /* r0 <- current position of code */ adr这条指令没有理解正确,因为把它想成mv r0,_start了,实际上adr这里的_start是相对的,如果从flash运行的话,r0就是0, 如果从ram运行的话,r0就是C100000 |
|