内存问题 动态加载地址和运行时地址

动态加载地址和运行时地址

运行地址: 应该是说程序运行的地址空间。
这个会有两种情况:
一种有虚拟地址(MMU)的系统里面,对所有应用程序来说,它自己看到的都是自己的空间。两个不同的程序完成认为自己在自己独立的空间中运行,所以它们之 间的地址是可以重叠的,比如,A访问0x00400000, 可以读取一个值,B可以访问同样的地址,读取自己的值。两者互不干扰。这种运行地址是一种虚拟地址。
一种是没有MMU的系统里面,比如一些实时系统,它创建了两个任务,那就不能有重叠的地址空间,除非两个任务需要访问共同的一个公共变量。就是说它们的运行地址是统一规划的。A用了一块地址空间,B就不可再有相重叠的地址空间。

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

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




引申知识:
在微机的发展初期,BIOS都存放在ROM(Read Only Memory,只读存储器)中。ROM内部的资料是在ROM的制造工序中,在工厂里用特殊的方法被烧录进去的,其中的内容只能读不能改,一旦烧录进去,用户只能验证写入的资料是否正确,不能再作任何修改。如果发现资料有任何错误,则只有舍弃不用,重新订做一份。ROM是在生产线上生产的,由于成本高,一般只用在大批量应用的场合。
由于ROM制造和升级的不便,后来人们发明了PROM(Programmable ROM,可编程ROM)。最初从工厂中制作完成的PROM内部并没有资料,用户可以用专用的编程器将自己的资料写入,但是这种机会只有一次,一旦写入后也 无法修改,若是出了错误,已写入的芯片只能报废。PROM的特性和ROM相同,但是其成本比ROM高,而且写入资料的速度比ROM的量产速度要慢,一般只适用于少量需求的场合或是ROM量产前的验证。
EPROM(Erasable Programmable ROM,可擦除可编程ROM)芯片可重复擦除和写入,解决了PROM芯片只能写入一次的弊端。EPROM芯片有一个很明显的特征,在其正面的陶瓷封装上,开有一个玻璃窗口,透过该窗口,可以看到其内部的集成电路, 紫外线透过该孔照射内部芯片就可以擦除其内的数据,完成芯片擦除的操作要用到EPROM擦除器。EPROM内资料的写入要用专用的编程器,并且往芯片中写 内容时必须要加一定的编程电压(VPP=12~24V,随不同的芯片型号而定)。EPROM的型号是以27开头的,如27C020(8*256K)是一片 2M Bits容量的EPROM芯片。EPROM芯片在写入资料后,还要以不透光的贴纸或胶布把窗口封住,以免受到周围的紫外线照射而使资料受损。

原文地址:https://www.cnblogs.com/wfwenchao/p/5019422.html