21009|83

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教关于EBOOT [复制链接]

请问:
ALIGN
INITMMU

        ; *****************************************************************
        ;  Load RVA of OEMAddressTable[]
        ;

add        r0, pc, #OEMAddressTable-(.+8)        ; (r0) = OEMAddressTable phys addr   *DO NOT DESTROY THIS VALUE
mov        r11, r0                        ; (r11) = &MemoryMap (save pointer for later)
请问这句话的详细意思是什么呢??
特别是-(.+8)
谢谢各位

最新回复

不太懂,观望  详情 回复 发表于 2009-1-9 11:09
点赞 关注

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
这是ARM流水线。
如果add r0, pc, #OEMAddressTable
那么PC会得到OEMAddressTable+8的指令的地址。
为了符合实际,就要减回来
add r0, pc, #OEMAddressTable-(.+8)
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

thank u!
现在你很牛很强大!
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 2 楼 wangxin_801115 的回复:

thank u!
现在你很牛很强大!


比起你们来,俺还是要继续学习才行,估计明年项目多起来,就没有那么多时间来逛论坛了。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

5
 
但是还有个问题:

1、OEMAddressTable是物理地址还是虚拟地址(内存地址)
2、OEMAddressTable是相对地址还是绝对地址
3、MMU现在是否还没被打开
4、如果OEMAddressTable是虚拟地址
   那么 PC+OEMAddressTable == 物理地址????
   (PC也是虚拟地址)
5、如果OEMAddressTable是物理地址
   那么是不是可以直接mov r0 #OEMAddressTable

???????
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

6
 
前面的问题在此论坛上讨论过,有明确的结果,说明你看贴还不够认真
后面的问题,OEMAddressTable里面既有物理地址也有虚拟地址,你没有看过吗?
里面是物理地址映射虚拟地址的一个表,不知道你这问题是怎么问出来的?
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

7
 
我的理解是:
1、OEMAddressTable是虚拟地址还是物理地址取决与PC的地址
2、OEMAddressTable是相对地址还是绝对地址取决于他的使用方式
3、MMU没被打开
4、这样些是PIC规范,并不是PC的数值+ OEMAddressTable的绝对地址,而是PC加上到OEMAddressTable的偏移量,就是相当于取OEMAddressTable标号的地址
5、OEMAddressTable是一个标号,取标号的地址到寄存器有两种方法
LDR r0, [pc, #OEMAddressTable-(.+8)]
LDR r0, =OEMAddressTable
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

8
 
标号地址的问题我也迷糊,不知道我的理解对不对,

这个帖子和http://topic.eeworld.net/u/20081023/12/32e215de-ddf3-4fbe-8992-a4384ce0c3ec.html 这个帖子一脉相承
从 StartUp 到 KernelStart
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

9
 
C:\WINCE500\PRIVATE\WINCEOS\COREOS\NK\KERNEL\ARM\armtrap.s
楼主看看这个代码就知道是怎么回事了。
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

10
 
从OEMAddressTable出现地方,它是物理地址的。不知道是否因为在它编译的时候这个MMU都没有打开,这个东西的确有点奇怪的。
我发现是否是虚拟地址一般就会扯上MMU,只要一开MMU,立刻就是虚拟地址了。不知道这个微软的编译器是怎么做的?但是看了代码,事实就是这样——是否是虚拟地址和MMU是否开启有关,这个我有点纳闷。编译器真的可以这样弄的吗?
欢迎来讨论,不知道我的理解是否正确。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

11
 
这是一条伪指令,作用是把OEMAddressTable的地址加载到r0。比较难理解的是(.+8)这个表达式。.其实代表当前指令的地址。比如说这条指令:
LABEL1
   LDR R0, .
作用是把LABEL1的地址加载到R0中。
这里还要知道一点ARM架构的特点,一条指令从加载到执行主要分为预取、译码、执行三个阶段。执行add r0, pc, #OEMAddressTable-(.+8)时,pc寄存器的值实际上指向下下条指令。另一方面,.是在MS的ARM编译器在预处理时决定的,它的值为当前指令的地址,因此有恒等式.+8=pc。
明白了这两点,这条指令就很容易理解了:
r0 = pc+OEMAddressTable-(.+8) = OEMAddressTable + (pc-(.+8)) = OEMAddressTable

搞得这么复杂,其实有一条更简单更好理解的指令和它等价:
adr r0, OEMAddressTable
微软有时候尽干傻事,简单的事情非要复杂化。
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

12
 
ADR是一条伪指令,汇编器汇编时也会尝试用ADD或SUB指令来构造这个地址,如果构造地址失败就产生一个Error
MS这样写只是少转了一次弯
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

13
 
这条指令不管是虚拟地址还是物理地址都可以工作,因为OEMAddressTable的地址是根据PC寄存器算出来的。这里面包含两个假设,即运行时如果PC寄存器是物理地址则OEMAddressTable也是物理地址;如果PC是虚拟地址则OEMAddressTable也是虚拟地址。而编译时OEMAddressTable使用物理地址还是虚拟地址其实是无关紧要的,因为OEMAddressTable和.一减就只剩下偏移量了。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

14
 
感谢各位!

引用 5 楼 hzdysymbol 的回复:
前面的问题在此论坛上讨论过,有明确的结果,说明你看贴还不够认真
后面的问题,OEMAddressTable里面既有物理地址也有虚拟地址,你没有看过吗?
里面是物理地址映射虚拟地址的一个表,不知道你这问题是怎么问出来的?

没看懂你说的什么

 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

15
 
引用 11 楼 navi_dx 的回复:
ADR是一条伪指令,汇编器汇编时也会尝试用ADD或SUB指令来构造这个地址,如果构造地址失败就产生一个Error
MS这样写只是少转了一次弯


这个ADR伪指令作用范围有限制的。
超过一定距离、长度的标号他就有心无力了。
所以微软使用add r0, pc, #OEMAddressTable-(.+8)的办法有时候未必没有道理的。
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

16
 
还想请教一个问题:
‘8’是怎么算出来的呢?
ALIGN
INITMMU

        ; *****************************************************************
        ;  Load RVA of OEMAddressTable[]
        ;

add        r0, pc, #OEMAddressTable-(.+8)        ; (r0) = OEMAddressTable phys addr   *DO NOT DESTROY THIS VALUE
mov                r11, r0                        ; (r11) = &MemoryMap (save pointer for later)
                IF :LNOT: :DEF: ETHBOOT
                bl                KernelStart        ; Branch to coreos\armtrap.s::KernelStart()
                                                ; should not return, NK now in control
                nop
                nop
                nop
DEADLOOP
                b                DEADLOOP
                ENDIF
                ; For GPIO / soft reset, don't go to Eboot main(), go to launch address from load.
                tst                r10, #RCSR_GPIO_RESET
                beq                CONTINUE

                ; Get previously saved launch address
                ldr                r4, =(RESET_LAUNCH_ADDR_PHYSICAL)        ; pointer
                ldr                r3, [r4]                                                        ; launch address
                ldr                r2, =PhysicalStart
                ;
                ; First, we need to find the Offset that will get us from Virtual->Physical for
                ; the EBOOT Partition
                ;
                ldr                r5, =(EBOOT_PARTITION_PHY_BASE - SDRAM_VIR_C_EBOOT_PARTITION)
                ;
                ; Next, we add the above found Offset to PhysicalStart's RVA.
                ;  (R2 now points to the Physical address of PhysicalStart (below).)
                ;
                add                r2, r2, r5
                mov                r1, r10                    ; Contains soft reset indicators.
                IF Interworking :LOR: Thumbing
                        bx        r2
                ELSE
                        mov        pc, r2
                ENDIF
                nop                                ; These NOPs are used to flush the Pipeline
                nop
                nop
                nop
                nop
                nop
                nop
                nop
                b        CONTINUE                ; branch around Include (do not move)
                INCLUDE MemMap.inc                      ; **NOTE:  DO NOT move this!  Must be in this section
是这两行红字之间的距离吗??
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

17
 
哦理解错了!
 
 
 

回复

52

帖子

0

TA的资源

一粒金砂(初级)

18
 
引用 14 楼 gooogleman 的回复:

这个ADR伪指令作用范围有限制的。
超过一定距离、长度的标号他就有心无力了。
所以微软使用add r0, pc, #OEMAddressTable-(.+8)的办法有时候未必没有道理的。


所以有人这样写LDR r0, =g_oalAddressTable

还有个问题 LDR r0, =g_oalAddressTable 和LDR r0, g_oalAddressTable差别在哪里,查了资料但是还是很迷糊
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

19
 
引用 17 楼 navi_dx 的回复:
引用 14 楼 gooogleman 的回复:

这个ADR伪指令作用范围有限制的。
超过一定距离、长度的标号他就有心无力了。
所以微软使用add r0, pc, #OEMAddressTable-(.+8)的办法有时候未必没有道理的。


所以有人这样写LDR r0, =g_oalAddressTable

还有个问题 LDR r0, =g_oalAddressTable 和LDR r0, g_oalAddressTable差别在哪里,查了资料但是还是很迷糊


——不用查资料,在ADS下反汇编看看,比较一下到底会生成什么代码就OK了。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

20
 
引用 17 楼 navi_dx 的回复:
引用 14 楼 gooogleman 的回复:

这个ADR伪指令作用范围有限制的。
超过一定距离、长度的标号他就有心无力了。
所以微软使用add r0, pc, #OEMAddressTable-(.+8)的办法有时候未必没有道理的。


所以有人这样写LDR r0, =g_oalAddressTable

还有个问题 LDR r0, =g_oalAddressTable 和LDR r0, g_oalAddressTable差别在哪里,查了资料但是还是很迷糊

LDR r0, =g_oalAddressTable
这么用的是虚拟地址,只能在MMU开启了以后用。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表