打印
[嵌入式linux]

uboot中的关于当前程序运行位置的判定问题望大神解决下

[复制链接]
945|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
su402602449|  楼主 | 2014-3-15 10:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看下程序
/***************** CHECK_CODE_POSITION ******************************************/
        adr        r0, _start                /* r0 <- current position of code   */
        ldr        r1, _TEXT_BASE                /* test if we run from flash or RAM */
        cmp        r0, r1                        /* don't reloc during debug         */
        beq        stack_setup
/***************** CHECK_CODE_POSITION ******************************************/
就是这两句如何判定是运行在flash当中还是运行在RAM当中是如何判定出来的不太懂
adr        r0, _start                /* r0 <- current position of code   */
ldr        r1, _TEXT_BASE                /* test if we run from flash or RAM */

相关帖子

沙发
jplzl| | 2014-3-17 08:53 | 只看该作者
本帖最后由 jplzl 于 2014-3-17 09:15 编辑

关键两点:
1.adr r0,_start是条PC相关的指令,即r0 = (PC+8) +/- _start ?
  即r0存放_start地址值
  可以查看反汇编 arm-linux-gcc-objdump -D vmlinux > vmlinux.s

_star为起始值,可表明内核映像放置的位置(flash或RAM)
  即:
   如果是在flash,_start=0x0000 0000 假设放置在flash地址0x0000 0000处
  如果是在SDRAM,_start=0x0c70 0000 假设放在SDRAM地址0x0c70 0000处

2.了解TEXT_BASE:
  U-BOOT编译时设定的内核映像连接起始地址,即假设U-BOOT是要放置在TEXT_BASE地址起始处的
通常TEXT_BASE是RAM地址,因为通常U-BOOT是在RAM中运行的
因此,
通过判断r0与TEXT_BASE的值是否相同,即可判断是在FLASH还是SDRAM中了

汇编如下:
adr r0,_start  --       c700108:        e24f0e11         sub        r0, pc, #272        ; 0x110
ldr r1,TEXT_BASE -- c70010c:        e51f1034         ldr        r1, [pc, #-52]        ; c7000e0 <_TEXT_BASE>
cmp r0,r1               c700110:        e1500001         cmp        r0, r1

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

7

帖子

0

粉丝