http://blog.csdn.net/mrbuffoon/article/details/48947267
Note:本文是基于80×86微处理器进行原理总结。
在内存地址上,我们要区分逻辑地址、线性地址以及物理地址这三个概念。
逻辑地址:包含在机器语言指令中用来指定一个操作数或者一条指令的地址。每一个逻辑地址都由一个段选择符和段偏移量组成。
线性地址:也称为虚拟地址,也不是一个真实的地址,他是对应了硬件页式内存转换前地址。
物理地址:就是物理内存中的真正地址。
内存控制单元(MMU)通过分段单元的硬件电路把一个逻辑地址转换为线性地址,接着,分页单元的硬件电路把线性地址转换为物理地址。
逻辑地址->线性地址:
逻辑地址中有段选择符和段偏移量两部分,首先通过段选择符可以得到一个线性段基址,然后加上段偏移量就能得到线性地址。这样,逻辑地址转换为线性地址。
线性地址->物理地址:
抽象出来看,线性地址可以目录、页表、偏移量三部分字段,通过页目录表和页表这两种转换表,可以将线性地址转换为物理地址。线性地址中的目录字段指明所要访问的内存处于页目录表中的哪一个页目录表项,由页目录表项中的内容可以知道要访问的内存在哪一个页表中;线性地址中的页表字段指明了所要访问的内存处于已经查到的页表中的哪一个页表项,由页表项中的内容可以知道要访问的内存在哪一页中;线性地址中的偏移量字段指明了所要访问的内存处于已经查到的页中的具体偏移位置,这个位置上就记录着对应的真正的物理地址。这样,线性地址就转换为了物理地址。
虚拟存储器:
现在机器都会有虚拟存储器这种机制,主要是用来解决机器实际内存不足的问题。计算机系统的内存主要由半导体存储器组成,由于工艺和成本的原因,内存的容量受到限制。然而,计算机系统软件和应用软件的功能不断增强,程序规模迅速扩大,要求内存的容量越大越好,这就产生了矛盾。为了给大的程序提供方便,使它们摆脱内存容量的限制,可以由操作系统把内存和辅存这两级存储系统管理起来,实现自动覆盖。也就是说,一个大作业在执行时,其一部分地址空间在内存,另一部分在辅存,当所访问的信息不在内存时,则由操作系统而不是程序员来安排I/O指令,把信息从辅存调入内存。从效果上来看,好像为用户提供了一个存储容量比实际内存大得多的存储器,用户无需考虑所编程序在内存中是否放得下或放在什么位置等问题。我们称这种存储器为虚拟存储器。
程序运行时,CPU以逻辑地址来访问内存,由辅助硬件找出逻辑地址和物理地址之间的对应关系,并判断这个逻辑地址对应的物理地址内容是否已装入内存。如果已在内存中,则CPU可直接访问内存的实际物理单元;如果不在内存中,则把包含这个字的一个存储块从外存调入内存后再由CPU访问。如果内存已满,则由替换算法从内存中将暂不运行的一块调回外存,再从外存调入新的一块到内存。