71

帖子

0

TA的资源

一粒金砂(初级)

21
 
引用 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开启了以后用。

回复

79

帖子

0

TA的资源

一粒金砂(初级)

22
 
这个地址的问题的确让人比较迷惑,毕竟这个编译器的规则我们不知道,我们只能看代码推测出是什么,然后总结一下。
总之大家都有一套。本帖是不错的帖子,引出问题,引起思考。........
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

23
 
请问:
    为什么要在INITMMU这个函数中写这么一句add r0, pc, #OEMAddressTable-(.+8)

所谓“位置无关程序”
是不是说 根本不用考虑 “OEMAddressTable”这个是物理地址还是虚拟地址
仅仅把它当作一个标记 ,用add r0, pc, #OEMAddressTable-(.+8)实现跳转功能
???
还是不太理解这个东西
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

24
 
引用 22 楼 wangxin_801115 的回复:
请问:
    为什么要在INITMMU这个函数中写这么一句add r0, pc, #OEMAddressTable-(.+8)
——这个不知道在哪里的,请举出具体位置。

所谓“位置无关程序”
是不是说 根本不用考虑 “OEMAddressTable”这个是物理地址还是虚拟地址
仅仅把它当作一个标记 ,用add r0, pc, #OEMAddressTable-(.+8)实现跳转功能
???
是这个意思,一旦这个程序运行起来后,这个标号就只管使用了,你都无需去考虑



在内核启动函数中的那个标号的使用才是比较特殊的,ARMtrap.s中有些代码也要注意(因为有些标号,比如pTs是直接绑定到虚拟地址的,当还没有启用MMU之前,我们肯定是要把他转换成物理地址才能用。),其他的基本不用太多理会

我前几天那个MMU的帖子就涉及这个地址转换的过程。
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

25
 

有点明白了

这段是“位置无关程序”,而OEMAddressTable只是这个地址映射表前面的标记

那么add r0, pc, #OEMAddressTable-(.+8)这段代码在编译和链接时会计算PC跳转的长度,
直接找到以OEMAddressTable为标记的一段代码所在的地址,这个地址不是显示可见的,
也不需要计算(因为编译器已经计算好了)
也可以直接传到r0中:ldr r0,= OEMAddressTable; 原理与上面的相同

这段代码直接找到这个OEMAddressTable地址后把这个表的地址传给R0,之后作为参数传给Kernelstart

1、不知道这样理解对不对??
2、Kernelstart这个函数在哪呢??
   我没找到它的原形

 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

26
 
引用 24 楼 wangxin_801115 的回复:
2、Kernelstart这个函数在哪呢??
  我没找到它的原形


你???不厚道,我的帖子居然没有看过,搞得我一个人干了几天。
不说在哪里,给个地址你去重新看,哈哈,叫你不帮我。
http://topic.eeworld.net/u/20081231/10/bbde79c2-2884-48e3-9718-90d7fcc1afa8.html
就在这里了,我把他的代码都贴出来了。

以后别人的帖子你可以不看,我的一定要帮忙啊。O(∩_∩)O哈哈~
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

27
 
这个贴子加精了。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(中级)

28
 
引用 26 楼 BEYONDMA 的回复:
这个贴子加精了。


支持,因为这个也挺难理解的。也很多人问。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

29
 
哈哈!
强人!
接下来按你的思路学习一下这段码!
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

30
 
学习一下
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

31
 
arm7是基于三级流水线指令,因此pc相对偏移地址是2个word,即8的缘故。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

32
 
装载OEMAddressTable的地址到r0,由于流水线的原因(arm9为5级流水线:取指,译码,执行,存储器访问,写回),pc所指位置是当前执行指令的下两条(即取指),所以.+8.   其中这个“.”是当前执行语句的地址。
至于为什么要写成这个样子,上次也讨论过,也没讨论出个啥,有人说因为不能直接赋值,所以要借助PC的相对位置来赋值。

OEMAddressTable可以理解为一个数组的首地址,这个数组就是虚实地址的映射表,数组的每个元素有3个字段。
它的地址当然是实地址了,这个时候代码中startup中执行,并没有打开MMU,其中的操作都是对应的物理地址,所以当然是物理地址。
这样的操作一般是得到OEMAddressTable这个数组的首地址,然后再把这个数组拷贝到某个地方。

上次也讨论了,为啥没加精呢?感觉最近推荐的帖子好多,难道2009版主也勤奋了?
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

33
 
引用 13 楼 wangxin_801115 的回复:
感谢各位!

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

没看懂你说的什么

不好意思,后面的问题看差了
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

34
 
学习!
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

35
 
关注~
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

36
 
引用 31 楼 kaios1 的回复:
装载OEMAddressTable的地址到r0,由于流水线的原因(arm9为5级流水线:取指,译码,执行,存储器访问,写回),pc所指位置是当前执行指令的下两条(即取指),所以.+8.  其中这个“.”是当前执行语句的地址。
至于为什么要写成这个样子,上次也讨论过,也没讨论出个啥,有人说因为不能直接赋值,所以要借助PC的相对位置来赋值。

OEMAddressTable可以理解为一个数组的首地址,这个数组就是虚实地址的映射表,数组的每个元素…


加了个新版主啊。

以前有些不是很好的东西也推荐,
现在不同了,哈哈,新版主来了。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

37
 
guanzhu
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

38
 
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

39
 
学习学习
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

40
 
看看。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表