OS-分页、页表

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Co_zy/article/details/87192071

大部分虚拟内存系统中都使用一种称为 分页(paging) 的技术,我们现在就介绍这一技术。在任何一台计算机上,程序引用了一组内存地址。当程序执行指令
MOV REG, 1000
时,它把地址为1000的内存单元的内容复制到REG中(或者相反,这取决于计算机的型号)。地址可以通过索引、基址寄存器、段寄存器或其他方式产生。
由程序产生的这些地址称为 虚拟地址( virtual address) ,它们构成了一个 虚拟地址空间( virtual addressspace) 。在没有虚拟内存的计算机上,系统直接将虚拟地址送到内存总线上,读写操作使用具有同样地址的物理内存字;而在使用虚拟内存的情况下,虚拟地址不是被直接送到内存总线上,而是被送到 内存管理单元( Memoiy Management Unit, MMU) ,MMU把虚拟地址映射为物理内存地址,如图3-8所示。
图3-9所示的简单例子说明了这种映射是如何工作的。在这个例子中,有一台可以产生16位地址的计算机,地址范围从0到64K-1,且这些地址是虚拟地址。然而,这台计算机只有32KB的物理内存,因此,虽然可以编写64KB的程序,但它们却不能被完全调入内存运行。在磁盘上必须有一个最多64KB的程序核心映像的完整副本,以保证程序片段在需要时能被调入内存。

在这里插入图片描述
虚拟地址空间按照固定大小划分成被称为 页面(page) 的若干单元。在物理内存中对应的单元称为 页框(page frame)。页面和页框的大小通常是一样的,在本例中是4KB,但实际系统中的页面大小从512字节到1GB。对应干64KB的虚拟地址空间和32KB的物理内存,可得到16个虚拟页面和8个页框。
RAM和磁盘之间的交换总是以整个页面为单元进行的。很多处理器根据操作系统认为适合的方式,支持对不同大小页面的混合使用和匹配。例如,X86-64架构的处理器支持4KB、2MB和1GB大小的页面,因此,可以将一组4KB大小的页面用于用户程序,将一个1GB大小的页面用于内核程序。稍后将介绍为什么有时候用一个较大的页面好于用一堆较小的页面。
图3-9中的标记符号如下:标记0K-4K的范围表示该页的虚拟地址或物理地址是0-4095, 4K~8K的范围表示地址4096-8191,等等。毎一页包含了4096个地址,起始于4096的整数倍位置,结束于4096倍数缺1的位置。
当程序试图访问地址0时,例如执行下面这条指令
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中)被映射到物理地址24 576 (在物理页框6中)上。第三个例子,虚拟地址20 500在距虚拟页面5 (虚拟地址20 480~24 575>起始地址20字节处,并且被映射到物理地址12 288 + 20=12 308。通过恰当地设置MMU,可以把16个虚拟页面映射到8个页框中的任何一个。但是这并没有解决虚拟地址空间比物理内存大的问题。在图3-9中只有8个物理页框,干是只有8个虚拟页面被映射到了物理内存中,在图3-9中用叉号表示的其他页面并没有被映射。在实际的硬件中,用一个 “在/不在”位(present/absent bit) 记录页面在内存中的实际存在情况。
当程序访问了一个未映射的页面,例如执行指令
MOV REG, 32780
将会发生什么情况呢?虚拟页面8 (从32 768开始)的第12个字节所对应的物理地址是什么呢? MMU注意到该页面没有被映射(在图中用叉号表示),于是使CPU陷入到操作系统,这个陷阱称为 缺页中断缺页错误( page fault) 。操作系统找到一个很少使用的页框且把它的内容写入磁盘(如果它不在磁盘上)。随后把需要访问的页面读到刚才回收的页框中,修改映射关系,然后重新启动引起陷阱的指令。

例如,如果操作系统决定放弃页框1,那么它将把虚拟页面8装入物理地址4096,并对MMU映射做两处修改。首先,它要将虚拟页面1的表项标记为未映射,使以后任何对虚拟地址4096-8191的访问都导致陷阱。随后把虚拟页面8的表项的叉号改为1,因此在引起陷阱的指令m新启动时,它将把虚拟地址32 780映射为物理地址4108 (4096+12)。
下面査看一下MMU的内部结构以便了解它是怎么工作的,以及了解为什么我们选用的页面大小都是2的整数次幂 6 在 图 3-10中可以看到一个虚拟地址的例子,虚拟地址 8196 (二进制是0010000000000100)用图3-9所示的MMU映射机制进行映射,输入的丨6位虚拟地址被分为4位的页号和12位的偏移置。4位的页号可以表示16个页面,12位的偏移可以为一页内的全部4096个字节编址。
可用 页号 作为 页表( page table) 的索引,以得出对应于该虚拟页面的页框号。如果“在/不在”位是0,則将引起一个操作系统陷阱。

在这里插入图片描述

在这里插入图片描述

页表项

页表项的结构是与机器密切相关的,但不同机器的页表项存储的信息都大致相同。图3-11中给出了页表项的一个例子。不同计算机的页表项大小可能不一样,但32位是一个常用的大小。最重要的域是 页框号。毕竟页映射的目的是找到这个值,其次是“在/不在”位。这一位是1时表示该表项是有效的,可以使用,如果是0,则表示该表项对应的虚拟页面现在不在内存中,访问该页面会引起一个缺页中断。
保护(protection)位 指出一个页允许什么类型的访问。最简单的形式是这个域只有一位,0表示读/写,1表示只读。一个更先进的方法是使用三位,各位分别对应是否启用读、写、执行该页面。

为了记录页面的使用状况,引入了修改(modified)位访问( referenced)位。在写入一贞时由硬件自动设置修改位。该位在操作系统重新分配页框时是非常有用的。如果一个页面已经被修改过(即它是“脏”的),则必须把它写回磁盘。如果一个页面没有被修改过(即它是“干净”的),则只简单地把它丢弃就可以了,因为它在磁盘上的副本仍然是有效的。这一位有时也被称为脏位(dirty bit),因为它反映了该页面的状态。
不论是读还是写,系统都会在该页面被访问时设置访问位。它的值被用来帮助操作系统在发生缺页中断时选择要被淘汰的页面。不再使用的页面要比正在使用的K面更适合淘汰。这一位在即将讨论的很多页面置换算法中都会起到重要的作用。
最后一位用于禁止该页面被高速缓存。对那些映射到设备寄存器而不是常规内存的页面而言,这个特性是非常重要的。假如操作系统正在紧张地循环等待某个I/O设备对它刚发出的命令作出响应,保证硬件是不断地从设备中读取数据而不是访问一个旧的被高速缓存的副本是非常東要的。通过这一位可以禁止髙速缓存。具有独立的I/O空间而不使用内存映射1/0的机器不需要这一位。
应该注意的是,若某个页面不在内存中,用干保存该页面的磁盘地址不是页表的组成部分。原因很简单,页表只保存把虚拟地址转换为物理地址时硬件所需要的信息。操作系统在处理缺页中断时需要把该页面的磁盘地址等信息保存在操作系统内部的软件表格中。硬件不需要它。
在这里插入图片描述
为了更好理解页表项,我们来看一下这个例子
这里直接贴上链接
https://blog.csdn.net/u010744711/article/details/51254120/
引用了一张图片

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Co_zy/article/details/87192071