上几篇文章学习了任务切换相关知识,如下:

今天继续学习保护模式下的分页机制。本篇文章先介绍段页式内存管理的基本概念。

1、回顾

分段机制我们已经再熟悉不过了,前面我们学习过的所有内容都是在分段的机制下工作的。

对于一个多任务系统。如果任务比较多,很有可能导致物理内存不够分配的情况。这个时候,操作系统的作用就体现出来了。每个段的描述符都有一个TYPE字段。其中有一个A位,每当访问一个段时,该段的A位就记录该段最近是否被访问过。

当一个段很长时间不被访问,操作系统就去将该段从内存中移出去,移到磁盘。从而可以空出一块空闲的内存空间可以供其他程序的段来运行。当这个段页不怎么被访问了,操作系统用同样的方法将其移出去,再加载另一个需要被访问的段。

但是,因为段的长度不确定,在分配内存时,可能会发生内存空间中的区域小于要加载的段,或者空闲区域远远大于要加载的段。在前一种情况下,需要另外寻找合适的空闲区域;在后一种情况下,分配会成功,但是太过于浪费。

为了解决这个问题,从80386开始引入了分页机制。

分页机制从总体上来讲,使用长度固定的页来代替长度不一定的段,借此来解决因为段长度不同而带来的内存空间的管理问题。

2、简单的分页模型

2.1 回顾分段模型

如下图是一个分段管理机制的模型图:

如上图,在分段机制下,段地址和偏移地址经过段部件后,得到的线性地址,就是实际的物理地址。分段机制还是很好理解的。这里我们不再赘述。

2.2 分页机制概述

一旦采用分页式内存管理,就应该把4GB内存分成大小相同的页。如下图:

页的最小单位是4KB,也就是4096字节,用16进制表示就是0x1000。4GB的物理内存,可以划分为1048576个页。很显然,页的物理地址,其低12位始终位0.

注意:段管理机制是无法关闭的。段基址是Intel处理器最基本的管理机制,即使开启分页功能,分段机制依然存在。段部件依然工作。

在分页机制下,程序依然是按照分段来组织的。问题在于,如何将程序中比较大的段,映射到大小相同的页面上呢?

内存分配涉及到段的分配和页的分配。 段的分配就是在虚拟地址空间分配各个段,页的分配就是在物理内存中个各个段分配相应数量的页面。如下图:

如上图,左边的是4GB的虚拟地址空间,右边是真实的物理内存空间。

在分页模式下,操作系统一般为每个任务创建一个独立的4GB的虚拟地址空间。因此操作系统首先将程序的段映射到相应的虚拟地址空间中(在这个过程中也是需要在虚拟地址空间中寻找空闲空间的)。然后为虚拟地址空间中的各个段分配相应数量的物理地址空间(这是真实的执行代码的内存地址空间)。

如上图,段肯定是需要连续的,但是一个段被分配到物理内存中不一定需要分配连续的页面。其实,往往段在内存中对应的页面都是不连续的。

注意:4GB的虚拟内存空间不可能保存任何数据和代码,因为它是虚拟的,它只是用来指示内存的使用情况。

2.3 页映射表概述

因为我们现在引入了虚拟内存,所以之前分段机制下,段部件输出的地址本身是实际物理地址,现在有了虚拟内存,我门的程序中的代码和数据首先是需要映射到虚拟内存的,所以现在段部件输出的地址就是虚拟地址。也就是说,从段部件输出的线性地址,此时是虚拟地址。

为了根据虚拟地址(线性地址)找到真实的物理地址。操作系统必须维护一张表,把线性地址(虚拟地址)转换成物理地址,这是一个反过程(为什么是反过程?下面有讲解)。

如下图:

因为有1048576个页,所以页转换表也是需要有1048576项。这是个一维表格。每个表项占4字节,内容为页的物理地址。

这个表格的用法是这样的:

  • 因为页的大小是4KB,故,线性地址的低12位可用于访问页内偏移,高20位可用于指定一个物理页。因此,把线性地址的高20位当成索引,乘以4,作为表内偏移量,从表中取出一个双字,那就是该线性地址所对应的页的物理地址。
  • 线性地址的低12位是页内偏移量,用页物理地址加上页内偏移量,就是最终的物理内存地址。

现在的问题在于,页映射表中对应的页的物理地址是怎么来的。这其实是一个反过程。当程序加载时,操作系统会位程序虚拟一个虚拟地址空间出来,然后将程序的段分配到这个虚拟地址空间中。当腰执行某一个段时,将该段拆分成一个或多个页,在物理内存中寻找相应的空闲页,然后将段分配给找到的页,再将这个页的地址与刚刚那个段的地址回写到页映射表。那么下次再访问该段时,就知道它所对应的页的物理地址了。

这就是先找到空闲页,然后将对应的映射关系回写到页映射表,这就是一个反过程。

我们知道,一般现在是多任务系统,对于多任务,每一个任务都有一个4GB的虚拟地址空间,并且每一个任务都有一个页映射表。如下图:

从上图我们很容易理解一件事:假设一个程序被多次加载到内存中执行,那么相当于一个程序有多个执行实体。这多个执行实体对应的虚拟地址空间是一模一样的。那么它们相同的段最终产生的线性地址将是一模一样的。因为它们每一个任务都有一个页映射表,所以它们对应的物理地址是不一样的。

3 总结

今天简单的学习段页式内存管理机制的概念。并简单了解页映射表机制的相关概念。

详细的内容还是要参考原书籍,这里只是做一个简单的总结。

学习探讨加个人:
qq:1126137994
微信:liu1126137994