免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6266 | 回复: 4
打印 上一主题 下一主题

mips u-boot中 .word的迷惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-31 10:48 |只看该作者 |倒序浏览
在看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 */


请各位大侠不吝赐教!

论坛徽章:
0
2 [报告]
发表于 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
上面这段代码很有意思,你可以仔细瞧瞧。

论坛徽章:
0
3 [报告]
发表于 2009-07-31 11:35 |只看该作者
推荐你阅读下mips on u-boot启动代码,比较有意思。我blog上有一篇我阅读时所写的笔记:
http://blog.chinaunix.net/u3/97889/showart_2007497.html

论坛徽章:
0
4 [报告]
发表于 2009-07-31 12:08 |只看该作者

回复 #2 otsscf 的帖子

那些数据存放在哪里了?要用它们的时候,怎么可以取的到?
它们的地址是不是和lds文件有关系?

[ 本帖最后由 zxbjlu1983 于 2009-7-31 13:50 编辑 ]

论坛徽章:
0
5 [报告]
发表于 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算出来的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP