欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

虚拟地址,逻辑地址,线性地址和物理地址 有大用

虚拟地址,逻辑地址,线性地址和物理地址

 (2015-04-07 18:56:25)
标签: 

虚拟地址

 

物理地址

 

内存空间

 

地址

 

程序


虚拟地址:
32位操作系统可寻址的最大内存空间为4GB,程序加载进内存之后操作系统让每个进程感觉自己独占所有的4GB内存空间,每个进程都可以寻址到0x00000000~0xFFFFFFFF的内存空间,但进程在物理内存中是不可能寻址到这样大的内存空间的,所以程序所”独占“的这4GB内存空间称为虚拟地址空间,这个地址空间中的地址称为虚拟地址。程序就在这个虚拟地址空间中一条一条的向后寻址(没有循环和分支的话)。至于操作系统如何让进程觉得自己独占所有内存空间,等下再讲。
逻辑地址:
稍微了解一点8086汇编都知道,在编写一个汇编程序的时候可以定义不同的段,不同段中的数据有不同的作用和属性。例如,数据段和堆栈段用来存放数据,其具有可读和可写两种属性;代码段用来存放代码,所以其仅具有可读的属性。每个段的段首地址存放在段寄存器中,根据不同的偏移量来寻址段中的数据,寻址格式是这样的”[segReg]:[offset]“。在DOS系统中,所有的这些都是在物理内存中完成的。如果将DOS系统假想成一个特殊的程序的话,操作系统将DOS加载进内存并分配给它4GB的虚拟空间,则DOS所做的寻址就都是在虚拟地址中进行的,所以DOS寻到的地址并不是真正的物理地址,所以称之为逻辑地址。
线性地址:
32位操作系统为内存分配的虚拟地址空间,从0x00000000~0xFFFFFFFF依次编号,则这些编号便构成了一维的线性地址空间。其中每一个编号便是一个线性地址。
物理地址:
当操作系统将程序加载进入物理内存后,真正存放程序的指令和数据的内存的地址就是物理地址了。

操作系统如何让程序认为自己独占所有的内存?
假如操作系统在物理内存中给程序分配了4K的内存,则我们将程序的虚拟空间也分割成4K一个的小片段,首先将虚拟地址的第一个4K加载进内存,执行完以后用虚拟空间中的第二个4K覆盖第一个4K继续执行。程序只是在虚拟地址空间中一次寻址,需要哪个4K就将那个4K加载进内存。这样,虽然系统只分配给该程序4K的内存空间,使用这样的方法无论这个程序有多大(小于4GB)都可以顺利的执行完毕。

在Linux中这三种地址是这样转换的?

执行完一条指令后,pc中存放着下一条指令的地址,此时pc中存放的便是下一条地址的逻辑地址,该逻辑地址和ecs中存放的段地址合成后便得到了地址空中该指令的线性地址,线性地址在经由MMU处理后便的到了该指令在内存单元中的物理地址。


来自 http://blog.sina.com.cn/s/blog_142fca41e0102vi1w.html


普通分类: