ARM9的2440的启动代码uboot汇编部分从nand flash中拷贝到SDRAM的问题?

网上一段话:”经过把U-BOOT进行make后,从所生成的两个.map文件来看(~/u-boot.map和Systen.map),所有的地址标号都是从0x33f80000... 网上一段话:” 经过把U-BOOT进行make后,从所生成的两个.map文件来看(~/u-boot.map和 Systen.map),所有的地址标号都是从0x33f80000开始的,就是从SDRAM的高地址开始,等于TEXT_BASE的值,也就是说,链接 器是从0x33F80000开始来链接所编译生成的目标文件的,而不是从0地址开始,经过查看,start_armboot=0x33f80d9c,就是 说void start_armboot (void)函数的入口地址在SDRAM中(链接器决定),所以执行。“
但是我想问的是我们在make后,既然所有地址的标号都是从0x33f80000开始的,那我们应该是make后才将uboot.bin文件下到ARM板,那应该一开始也是0x33f80000呀!那为什么一开始从nand flash运行呢。
展开
 我来答
超柏藋a2
2014-03-26 · TA获得超过184个赞
知道小有建树答主
回答量:161
采纳率:0%
帮助的人:104万
展开全部
uboot代码上电之后之所以能够正确执行,有个很重要的原因,就是最初执行的bootloader代码是地址无关的,即这个映象文件可以被放在内存中的任何一个地址上运行。上电开始执行时,pc从0开始,寻址是基于pc值的, 在pc值上+/-一个偏移值得到运行地址,如跳转指令B。卤煮明白了么?欢迎交流
追问
我知道pc是基于pc地址+偏移地址,uboot中有_start和TEXT_BASE两个地址比较。它是通过比较两个值不相等,然后进行拷贝代码。但我想问的是_start怎么会和TEXT_BASE相等呢。TEXT_BASE不是固定值0x33f80000吗?_start什么时候与TEXT_BASE地址值相同呢?是当拷贝代码正好拷贝到_start这个地方吗?
追答
_start怎么会和TEXT_BASE相等呢?
当代码被拷到ram上,他们就相等了。adr r0, _start是一条伪指令(注意区别与ldr),一般被编译器替换为sub r0, pc,#offset ,不要理解为读取 符合表中_start符号的地址(0x33F80000)。上电开始执行时,pc从0开始,所以现在r0值为0+offset,不等于_TEXT_BASE(0x33F80000)。ldr r2, _armboot_start之后,pc指向_TEXT_BASE(0x33F80000),此时比较结果相同。
匿名用户
2014-03-26
展开全部
S3C2440从NAND启动是将nandflash前4k的内容拷贝到IRAM里执行,前4K的代码然后拷贝完整的uboot到SDRAM里然后执行。
更多追问追答
追问
但make编译后地址不是地址的标号都是从0x33f80000开始的吗?那应该都在SDRAM中运行啊
这我也知道啊。我是说链接的时候。哎
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2014-03-26
展开全部
dsm.das,ma,fmawfeawjhjehjwffnfbdfngbwjwuwj;dofkd,mskt,cslughkjfghkjhfsjhsdkjskdfja
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式