免费注册 查看新帖 |

Chinaunix

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

[内核模块] 求大神分析分析运行地址,加载地址,链接地址,好纠结!!!!!!!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-02 18:07 |只看该作者 |倒序浏览
对这三个东西好纠结,有大神给分析分析吗,感激不尽

论坛徽章:
0
2 [报告]
发表于 2012-11-02 20:30 |只看该作者
不是大神,简单说下自己的理解。
运行地址: 应该是说程序运行的地址空间。
这个会有两种情况:
一种有虚拟地址(MMU)的系统里面,对所有应用程序来说,它自己看到的都是自己的空间。两个不同的程序完成认为自己在自己独立的空间中运行,所以它们之间的地址是可以重叠的,比如,A访问0x00400000, 可以读取一个值,B可以访问同样的地址,读取自己的值。两者互不干扰。这种运行地址是一种虚拟地址。
一种是没有MMU的系统里面,比如一些实时系统,它创建了两个任务,那就不能有重叠的地址空间,除非两个任务需要访问共同的一个公共变量。就是说它们的运行地址是统一规划的。A用了一块地址空间,B就不可再有相重叠的地址空间。

这样就引入了加载地址的概念,还继续上面两种情况划分。
有MMU管理的系统中,由操作系统动态规划分配置对应用程序放置到内存的那些位置。加上内存的虚拟映射,程序A认为自己在访问0x00400000 ,其它并不是真正的物理内存地址,而是再经过一层映射,转到实际的物理地址去读取,这个实际物理地址其它可进解为它真正的加载地址。是由系统来维护管理。所以不同的程序它的加载到实际物理内存中的地址肯定是不能重叠的。
而没有MMU管理的系统中,多个任务一般与内核统一编译,这样它们的加载地址就是它们的运行地址。程序访问地址就是实现的物理地址。或者要固定的空间内指定任务。

哎,不是大牛,就是不能讲得浅而易懂啊,,,不码字了。
要搞清楚这样,需要了解: 虚拟内存、 代码重定位机制, 与位置无关代码, 加载器与链接器《Linker and loader》有这本书好像,还有就是明白链接脚本文件。


论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
3 [报告]
发表于 2012-11-03 09:50 |只看该作者
建议LZ搜下
loaders and linkers

论坛徽章:
0
4 [报告]
发表于 2012-11-03 13:02 |只看该作者
回复 2# skychgg

skychgg 兄太谦虚了,我自己在这三个东西理解上很乱,特别是在看uboot的时候都是云里雾里,程序开始时在片内RAM上运行,然后跳到sdram上运行,ram的地址是0x0,而sdram是0x30000000,但是为什么反汇编的pc值是直接从0x30000000开始的,前面还没有进行代码搬移的的部分为什么pc确不是0x0开始的呢,能否再给我解解,感激不尽啊



   

论坛徽章:
0
5 [报告]
发表于 2012-11-05 08:16 |只看该作者
回复 4# 指针扰幽梦
---程序开始时在片内RAM上运行,然后跳到sdram上运行,ram的地址是0x0,而sdram是0x30000000,但是为什么反汇编的pc值是直接从0x30000000开始的。
1:程序最开始从那里启动,这是与硬件相关的,比如我所知道的MPC8308(Powerpc)芯片它是根据硬件外部几个连线决定从哪块启动,ZYNQ ZC702(ARM)先从自带ROM中启动等
2:程序跳转,一般常用的嵌入式应用都是代码刚开始在NorFlash\NandFlash\Rom中运行,拷贝到内存后跳转内存运行。
3:我们同样可看到,一般嵌入式入口相关函数都是用汇编写的,这部分的代码是位置无关的。
4:与位置无关的代码,意思就是:它里面访问内存及跳转用的是相对地址。这样的话这段代码不管加载到那里,都可以正常运行。
5:据我所知你的程序刚开始应该不是直接从片内RAM启动的吧?我觉得应该是硬件自带的ROM程序将你的程序拷贝到片内RAM的吧?
6:反汇编的起始地址,其实是由你的链接脚本文件决定的。UBOOT里面应该是对应平台的.lds文件。




   

论坛徽章:
0
6 [报告]
发表于 2012-11-05 15:30 |只看该作者
回复 5# skychgg
嗯,程序确实是2410自带的rom程序将代码拷到片内ram上,之前确实不知道还有这一步。这两天看了很多资料,才发现自己晕忽了自己,理解混乱了,反汇编的pc起始地址只是根据自己链接的地址决定的,而我却把在具体硬件上的执行地址跟这边的反汇编混淆了。再次感谢!


   

论坛徽章:
0
7 [报告]
发表于 2012-11-06 13:28 |只看该作者
回复 2# skychgg


    仰望星空
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP