操作系统学习分页机制

Posted ay-a

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统学习分页机制相关的知识,希望对你有一定的参考价值。

目录

1.分页机制介绍

2.页表结构

3.页表项格式

4.虚拟存储

5.直达底部

一、分页机制介绍

1. 什么是分页机制

分页机制是 80x86 内存管理机制的第二部分。它在分段机制的基础上完成虚拟地址到物理地址的转换过程。分段机制把逻辑地址转换成线性地址,而分页机制则把线性地址转换成物理地址。分页机制可用于任何一种分段模型。处理器分页机制会把线性地址空间划分成页面,然后这些线性地址空间页面被映射到物理地址空间的页面上。分页机制的几种页面级保护措施,可和分段机制保护措施和用或替代分段机制的保护措施。

2.分页机制如何启用

通过设置控制寄存器 CR0 的 PG 为可以启用分页机制。如果 PG=1,则启用分页操作,处理器会使用分页机制将线性地址转换成物理地址。如果 PG=0,则禁用分页机制,此时分段机制产生的线性地址直接用作物理地址。

与分段机制不同,分页机制对固定大小的内存块(称为页面)进行操作。分页机制把线性地址空间和物理地址空间都划分成页面。线性地址空间中的任何页面可以被映射到物理地址空间的任何页面上。如下图所示。

3.分页机制线性地址到物理地址转换过程

80x86使用 4K 字节固定大小的页面,每个页面均是 4KB,并且对其于 4K 地址边界处。 这表示分页机制把 2^32字节(4GB)的线性地址空间划分成 2^20(1M = 1048576)个页面。分页机制通过把线性地址空间中的页面重新定位到物理地址空间中进行操作。由于 4K 大小的页面作为一个单元进行映射,并且对其于 4K 边界,因此线性地址的低 12 位可做为页内偏移地量直接作为物理地址的低 12 位。分页机制执行的重定向功能可以看作是把线性地址的高 20 位转换到对应物理地址的高 20 位。

线性到物理地址转换功能,被扩展成允许一个线性地址被标注为无效的,而非要让其产生一个物理地址。以下两种情况一个页面可以被标注为无效的:

1. 操作系统不支持的线性地址。

2. 对应的虚拟内存系统中的页面在磁盘上而非在物理内存中。

在第一中情况下,产生无效地址的程序必须被终止,在第二种情况下,该无效地址实际上是请求 操作系统虚拟内存管理器 把对应的页面从磁盘加载到物理内存中,以供程序访问。因为无效页面通常与虚拟存储系统相关,因此它们被称为不存在页面,由页表中称为存在的属性来确定。

当使用分页时,处理器会把线性地址空间划分成固定大小的页面(4KB),这些页面可以映射到物理内存中或磁盘存储空间中,当一个程序引用内存中的逻辑地址时,处理器会把该逻辑地址转换成一个线性地址,然后使用分页机制把该线性地址转换成对应的物理地址。

如果包含线性地址的页面不在当前物理内存中,处理器就会产生一个页错误异常。页错误异常处理程序就会让操作系统从磁盘中把相应页面加载到物理内存中(操作过程中可能会把物理内存中不同的页面写到磁盘上)。当页面加载到物理内存之后,从异常处理过程的返回操作会使异常的指令被重新执行。 处理器把用于线性地址转换成物理地址和用于产生页错误的信息包含在存储与内存中的页目录与页表中。

分页机制与分段机制的不同

分页与分段的最大的不同之处在于分页使用了固定长度的页面。段的长度通常与存放在其中的代码或数据结构有相同的长度。 与段不同,页面有固定的长度。如果仅使用分段地址转换,那么存储在物理内存中的一个数据结构将包含其所有的部分。如果使用了分页,那么一个数据结构就可以一部分存储与物理内存中,而另一部分保存在磁盘中。

为了减少地址转换所要求的总线周期数量,最近访问的页目录和页表会被存放在处理器的一个叫做转换查找缓冲区(TLB)的缓冲器件中。 TLB 可以满足大多数读页目录和页表的请求而无需使用总线周期。 只有当 TLB 中不包含所要求的页表项是才会出现使用额外的总线周期从内存读取页表项。通常在一个页表项很长时间没有访问过时才会出现这种情况。

返回目录

二、页表结构

分页转换功能由驻留在内存中的表来描述,该表称为页表,存放在物理地址空间中。 页表可以看作是简单的 2^20 物理地址数组。 线性到物理地址的映射功能可以简单地看作进行数组查找。 线性地址的高 20 位构成这个数组的索引值,用于选择对应页面的物理(基)地址。线性地址的低 12 位给出了页面中的偏移量,加上页面的基地址最终形成对应的物理地址。 由于页面基地址对齐在 4K 边界上,因此页面基地址的低 12 为肯定是 0 ,这意味着 高 20 位的页面基地址 和 12 位偏移地址连接组合在一起就能得到对应的物理地址。

页表中每个页表项 大小为 32 位,由于只需其中的 20 位来存放页面的物理基地址,因此剩下的 12 位可用于存放诸如页面是否存在等的属性信息。如果线性地址索引的页表被标注为存在,则表示该项有效, 我们可以从中取得页面的物理地址。 如果项中表明不存在,那么当当访问对应物理界面时就会产生一个异常。

一、两级页表结构

页表含有 2^20 个表项,而每项占用 4 个字节。如果作为一个表来存放,最多将占用 4M 的内存。 为了减少内存占用量,80x86 使用了两级页表。 高 20 位线性地址到物理地址的转换被分成两步来进行,每次转换其中 10 位。

第一级表称为页目录,存放在一页 4K 大小的页面中,具有 2^10 个 4 字节长度的表项。 这些表象指向对应的二级表。 线性地址的最高 10 位(31-22)用作以及表中的索引。

第二级称为页表,长度也是 4K 大小的一个页面,最多有 1K 个 4 字节的表项。 每个 4 字节的表项含有相关页面的 20 位物理基地址。 二级页表使用线性地址的中间 10 位(21-12)作为表项索引值,以获取含有页面 20 物理地址基地址的表项。 该20位页面物理基地址和线性地址中的低12位(页内偏移)组合在一起就得到了分页转换过程的输出值,即对应的的最终物理地址。

二级页表的查找过程。其中 CR3 寄存器指定页目录表的基地址。线性地址的高10位用于索引这个页目录表,以获得指向相关第二级页表的指针。线性地址空间中间10位用于索引二级页表,以获得物理地址的高20位。线性地址的低12位直接作为物理地址的低12位,从而组成一个完整的32位物理地址。

二、不存在的页表

二级页表结构允许页表被分散在内存各个页面中,而不需要保存在连续的 4MB 内存块中。另外,并不需要为不存在的 或 线性地址空间未使用部分分配二级页表。 虽然目录表页面必须常驻内存中,但是二级页表可以在需要时再分配。这使得页表结构的大小对应于实际使用的线性地址空间大小。

页目录表中每个表项也有一个存在属性,类似于页表中的表项。页目录表项中的存在属性指明对应的二级页表是否存在。如果目录表指定的二级页表存在,那么通过访问二级表,表查找过程第二步将正常进行。如果存在位表明对应的二级表不存在,那么处理器就会产生一个异常来通知操作系统。页目录表项中的存在属性使得操作系统可以根据实际使用的线性地址范围来分配二级页表页面。

目录表项中的存在位还可用于在虚拟内存中存放二级页表。这意味着在任何时候只有部分二级页表需要存放在物理内存中,而其余的可保存在磁盘上。处于物理内存中页表对应的页目录项将被标注为存在,以表明可用它们进行分页转换。处于磁盘上的页表对应的页目录项将被标注为不存在。由于二级页表不存在而引发的异常会通知操作系统把缺少的页表从磁盘上加载进物理内存。把页表存储在虚拟内存中减少了保存分页转换所需要的物理内存量。

返回目录

三、 页表项格式

页目录和页表的表项格式如下图所示,其中位32-12含有物理地址的高20位,用于定位物理地址空间中一个页面(也叫页帧)的物理基地址。表项的低 12 位含有页属性信息。

  • P 位0是存在标志,用于指明表项对地址转换是否有效。 P=1 表示有效;P=0 表示无效。在页转换过程中,如果涉及的 页目录或页表的表项无效,则会导致一个异常。 如果 P=0,那么除表示表项无效外,其余位可供程序自由使用,如图中 b 所示

  • R/W 位1是读/写标志。如果等于1,表示页面可以被读、写或执行。如果为0,表示页面只读或可执行。当处理运行在超级用户特权级(级别0、1或2)时,则R/W位不起作用。页目录项中的R/W位对其所映射的所有页面起作用。

  • U/S 位2是用户/超级用户标志。如果为1,那么运行在任何特权级的程序都可以访问该页面,如果是0,那么页面只能被允许在超级特权级上的程序访问。页目录项中的U/S位对其所映射的所有页面起作用。

  • A 位5是已访问标志。当处理器访问页表项映射的页面时,页表项的这个标志就会被置为1.当处理器访问页目录表项映射的任何页面时,页表目录项的这个标志就会被置为1。处理器只负责设置该标志位,操作系统可通过定期地复位该标志来统计页面的使用情况。

  • D 位6是页面已被修改标志。当处理器对一个页面执行写操作时,就会设置对应页表表项的D标志。处理器并不会修改页目录项中的D标志。

  • AVL 该字段保留专供程序使用。处理器不会修改这几位,以后的升级处理器也不会。

返回目录

虚拟存储

也目录和页表表项中的存在标志 P 为使用分页技术的虚拟存储提供了必要的支持。若线性地址空间中的页面存在于物理内存中,则对应表项中的标志 P=1,并且该表项中含有相应的物理地址。页面不在物理内存中的表项其标志 P=0。 如果程序访问物理内存中不存在的页面,处理器就会产生一个缺页异常。此时操作系统就可以利用这个异常处理过程把缺少的页面从磁盘上调入物理内存中,并把相应物理地址存放在表项中,最后在返回程序重新执行引起异常的指令之前设置标志 P=1。

已访问标志 A 和已修改标志 D 可以用于有效地实现虚拟存储技术。通过周期性地检查和复位所有 A 标志,操作系统能够确定哪些页面最近没有访问过,这些页面可以成为移出到磁盘上的候选者。假设当一页面从磁盘上读入内存时,其脏标志 D=0,那么当页面再次被移出到磁盘上时,若 D标志还是0,则该页面就无需被写入磁盘中(因为没有被改)。若此时 D=1,则说明页面已经被修改过,于是就必须将该页面写到磁盘上。

返回目录

以上是关于操作系统学习分页机制的主要内容,如果未能解决你的问题,请参考以下文章

操作系统学习 保护机制概述

操作系统学习80x86保护模式内存管理

80386学习 80386分页机制与虚拟内存

自制操作系统05开启内存分页机制

你知道的Go切片扩容机制可能是错的

实模式与保护模式下的分段分页机制