- 论坛徽章:
- 0
|
不是大神,简单说下自己的理解。
运行地址: 应该是说程序运行的地址空间。
这个会有两种情况:
一种有虚拟地址(MMU)的系统里面,对所有应用程序来说,它自己看到的都是自己的空间。两个不同的程序完成认为自己在自己独立的空间中运行,所以它们之间的地址是可以重叠的,比如,A访问0x00400000, 可以读取一个值,B可以访问同样的地址,读取自己的值。两者互不干扰。这种运行地址是一种虚拟地址。
一种是没有MMU的系统里面,比如一些实时系统,它创建了两个任务,那就不能有重叠的地址空间,除非两个任务需要访问共同的一个公共变量。就是说它们的运行地址是统一规划的。A用了一块地址空间,B就不可再有相重叠的地址空间。
这样就引入了加载地址的概念,还继续上面两种情况划分。
有MMU管理的系统中,由操作系统动态规划分配置对应用程序放置到内存的那些位置。加上内存的虚拟映射,程序A认为自己在访问0x00400000 ,其它并不是真正的物理内存地址,而是再经过一层映射,转到实际的物理地址去读取,这个实际物理地址其它可进解为它真正的加载地址。是由系统来维护管理。所以不同的程序它的加载到实际物理内存中的地址肯定是不能重叠的。
而没有MMU管理的系统中,多个任务一般与内核统一编译,这样它们的加载地址就是它们的运行地址。程序访问地址就是实现的物理地址。或者要固定的空间内指定任务。
哎,不是大牛,就是不能讲得浅而易懂啊,,,不码字了。
要搞清楚这样,需要了解: 虚拟内存、 代码重定位机制, 与位置无关代码, 加载器与链接器《Linker and loader》有这本书好像,还有就是明白链接脚本文件。
|
|