操作系统内存最全解析!!!( 七 )


MOV REG, 0会将虚拟地址 0 送到 MMU 。MMU 看到虚拟地址落在页面 0 (0 - 4095),根据其映射结果,这一页面对应的页框 2 (8192 - 12287),因此 MMU 把地址变换为 8192 ,并把地址 8192 送到总线上 。内存对 MMU 一无所知,它只看到一个对 8192 地址的读写请求并执行它 。MMU 从而有效的把所有虚拟地址 0 - 4095 映射到了 8192 - 12287 的物理地址 。同样的,指令
MOV REG, 8192也被有效的转换为
MOV REG, 24576虚拟地址 8192(在虚拟页 2 中)被映射到物理地址 24576(在物理页框 6 中)上 。
通过恰当的设置 MMU,可以把 16 个虚拟页面映射到 8 个页框中的任何一个 。但是这并没有解决虚拟地址空间比物理内存大的问题 。
上图中有 8 个物理页框,于是只有 8 个虚拟页被映射到了物理内存中,在上图中用 X 号表示的其他页面没有被映射 。在实际的硬件中,会使用一个 在/不在(Present/absent bit)位记录页面在内存中的实际存在情况 。
未映射的页如何映射当程序访问一个未映射的页面,如执行指令
MOV REG, 32780将会发生什么情况呢?虚拟页面 8 (从 32768 开始)的第 12 个字节所对应的物理地址是什么?MMU 注意到该页面没有被映射(在图中用 X 号表示),于是 CPU 会陷入(trap)到操作系统中 。这个陷入称为 缺页中断(page fault) 或者是 缺页错误 。操作系统会选择一个很少使用的页并把它的内容写入磁盘(如果它不在磁盘上) 。随后把需要访问的页面读到刚才回收的页框中,修改映射关系,然后重新启动引起陷入的指令 。有点不太好理解,举个例子来看一下 。
例如,如果操作系统决定放弃页框 1,那么它将把虚拟机页面 8 装入物理地址 4096,并对 MMU 映射做两处修改 。首先,它要将虚拟页中的 1 表项标记为未映射,使以后任何对虚拟地址 4096 - 8191 的访问都将导致陷入 。随后把虚拟页面 8 的表项的叉号改为 1,因此在引起陷阱的指令重新启动时,它将把虚拟地址 32780 映射为物理地址(4096 + 12) 。
下面查看一下 MMU 的内部构造以便了解它们是如何工作的,以及了解为什么我们选用的页大小都是 2 的整数次幂 。下图我们可以看到一个虚拟地址的例子

操作系统内存最全解析!!!

文章插图
 
虚拟地址 8196 (二进制 0010000000000100)用上面的页表映射图所示的 MMU 映射机制进行映射,输入的 16 位虚拟地址被分为 4 位的页号和 12 位的偏移量 。4 位的页号可以表示 16 个页面,12 位的偏移可以为一页内的全部 4096 个字节 。
可用页号作为页表(page table) 的索引,以得出对应于该虚拟页面的页框号 。如果在/不在位则是 0 ,则引起一个操作系统陷入 。如果该位是 1,则将在页表中查到的页框号复制到输出寄存器的高 3 位中,再加上输入虚拟地址中的低 12 位偏移量 。如此就构成了 15 位的物理地址 。输出寄存器的内容随即被作为物理地址送到总线 。
页表在上面这个简单的例子中,虚拟地址到物理地址的映射可以总结如下:虚拟地址被分为虚拟页号(高位部分)和偏移量(低位部分) 。例如,对于 16 位地址和 4 KB 的页面大小,高 4 位可以指定 16 个虚拟页面中的一页,而低 12 位接着确定了所选页面中的偏移量(0-4095) 。
虚拟页号可作为页表的索引用来找到虚拟页中的内容 。由页表项可以找到页框号(如果有的话) 。然后把页框号拼接到偏移量的高位端,以替换掉虚拟页号,形成物理地址 。
操作系统内存最全解析!!!

文章插图
 
因此,页表的目的是把虚拟页映射到页框中 。从数学上说,页表是一个函数,它的参数是虚拟页号,结果是物理页框号 。
操作系统内存最全解析!!!

文章插图
 
通过这个函数可以把虚拟地址中的虚拟页转换为页框,从而形成物理地址 。
页表项的结构下面我们探讨一下页表项的具体结构,上面你知道了页表项的大致构成,是由页框号和在/不在位构成的,现在我们来具体探讨一下页表项的构成
操作系统内存最全解析!!!

文章插图
 
页表项的结构是与机器相关的,但是不同机器上的页表项大致相同 。上面是一个页表项的构成,不同计算机的页表项可能不同,但是一般来说都是 32 位的 。页表项中最重要的字段就是页框号(Page frame number) 。毕竟,页表到页框最重要的一步操作就是要把此值映射过去 。下一个比较重要的就是在/不在位,如果此位上的值是 1,那么页表项是有效的并且能够被使用 。如果此值是 0 的话,则表示该页表项对应的虚拟页面不在内存中,访问该页面会引起一个缺页异常(page fault) 。


推荐阅读