Chinaunix
标题:
mips u-boot中 .word的迷惑
[打印本页]
作者:
zxbjlu1983
时间:
2009-07-31 10:48
标题:
mips u-boot中 .word的迷惑
在看u-boot(MIPS)启动代码中有很多.word指令。
读mips指令资料中,.word是用来做数据声明的,如:var1: .word 3,但下面的代码中并没有类似val1:的出现,那这里的 .word _GLOBAL_OFFSET_TABLE_是做什么用的?
/* Initialize GOT pointer.
*/
bal 1f
nop
.word _GLOBAL_OFFSET_TABLE_
1:
move gp, ra
lw t1, 0(ra)
move gp, t1
/* Initialize any external memory.
*/
la t9, lowlevel_init
jalr t9
nop
还有诸如下面的:
#if defined(CONFIG_INCA_IP)
.word INFINEON_EBU_BOOTCFG /* EBU init code, fetched during booting */
.word 0x00000000 /* phase of the flash */
#elif defined(CONFIG_PURPLE)
.word INFINEON_EBU_BOOTCFG /* EBU init code, fetched during booting */
.word INFINEON_EBU_BOOTCFG /* EBU init code, fetched during booting */
请各位大侠不吝赐教!
作者:
otsscf
时间:
2009-07-31 11:32
var1: .word 中前面的varl只是一个标号而已,也就是用来标志你声明数据的地址,可要可不要。只要你有能力找到你声明的数据。
关于_GLOBAL_OFFSET_TABLE_的作用,你要理解MIPS中相关的知识比如GOT,PIC等。这个值应该是在链接的时候才确定的,然后放在你定义数据的地方。
/* Initialize GOT pointer.
*/
bal 1f
nop
.word _GLOBAL_OFFSET_TABLE_
1:
move gp, ra
lw t1, 0(ra)
move gp, t1
上面这段代码很有意思,你可以仔细瞧瞧。
作者:
otsscf
时间:
2009-07-31 11:35
推荐你阅读下mips on u-boot启动代码,比较有意思。我blog上有一篇我阅读时所写的笔记:
http://blog.chinaunix.net/u3/97889/showart_2007497.html
作者:
zxbjlu1983
时间:
2009-07-31 12:08
标题:
回复 #2 otsscf 的帖子
那些数据存放在哪里了?要用它们的时候,怎么可以取的到?
它们的地址是不是和lds文件有关系?
[
本帖最后由 zxbjlu1983 于 2009-7-31 13:50 编辑
]
作者:
otsscf
时间:
2009-07-31 18:49
标题:
回复 #4 zxbjlu1983 的帖子
那些数据存放在那里?当然是在代码里了,但代码刚开始一般在FLASH上面,所以他们也在FLASH里面,但是后来U-BOOT又把自己搬到了RAM里面,所以它们又在RAM里面了,你要真的想了解细节,就尝试着把u-boot/cpu/mips/start.S看懂。
如何找到它们,你可以从 start.S里面看到几种方法,比如下面这段代码算一种:
/* Initialize GOT pointer.
*/
bal 1f
nop
.word _GLOBAL_OFFSET_TABLE_
1:
move gp, ra
lw t1, 0(ra)
move gp, t1
下面也算一种,定义他们在in_ram标号前面,通过in_ram标号就能找到他们。
.word _gp
.word _GLOBAL_OFFSET_TABLE_
.word uboot_end_data
.word uboot_end
.word num_got_entries
in_ram:
此刻GOT的值与你的链接地址有关,加载地址是在board_init_f算出来的。
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2