【OS学习笔记】三十一 保护模式九:页目录、页表和页三者的关系详解 | 您所在的位置:网站首页 › 目录分页了 › 【OS学习笔记】三十一 保护模式九:页目录、页表和页三者的关系详解 |
上一篇文章学习了:保护模式九:段页式内存管理机制概述 本篇文章接着学习以下内容: 页目录概念页表概念页目录、页表与页之间的关系虚拟地址(线性地址)到物理地址的具体变换过程。 1、页目录、页表和页的对应关系第一个支持分页式内存管理的是Intel80386处理器。 我们知道,在上一篇文章学习的页映射表,是一个具有1048576个页表项的一维表格。又因为每个表项占4字节,所以,映射表的大小是4MB。是的,它很大!!! 为了解决这个占用内存过大的页映射表,分页机制采用了层次化的分页结构。具体实际上就是不采用单一的页映射表,而是将一个巨大的页映射表分成两个层次。如下图: 如上图,我们可以让一个页目录指向1024个页表。然后让这1024个页表中的页表项再指向所对应的物理内存空间的具体页。 每个页表可以指向1024个页,因为每个页表项是4字节的,所以每个页表的大小是4KB,刚好是一个页面的大小。页目录可以指向1024个页表,同样也是4KB,刚好是一个页面的大小。因为页目录和页表都刚好是一个页面的大小,所以页目录和页表都可以被当成普通的页存放于物理内存的页中。注意,页在页表内的分布是随机的。老任务不停的关闭,新任务不停的开始,页面的回收和再分配没有什么规律可言。以上的层次化结构是每个任务都有的。或者说,每个任务都有自己的页目录,页表。 如下图,在处理器内部有一个控制寄存器CR3,存放着当前任务页目录的物理地址。故又叫做页目录基址寄存器(PDBR)。 每个任务都有自己的任务状态段TSS。它是任务的标志性结构,存放了和任务相关的各种数据,其中就包括CR3寄存器域,存放了任务自己的页目录物理地址。 当任务切换时,处理器切换到新任务执行,而CR3寄存器的内容也要被更新,以指向新任务的页目录地址。相应的页目录又指向一个个页表,这就使得每个任务都只在自己的地址空间内运行。 从上图中可以看出,页目录和页表也是普通的物理页,混迹于全部的物理页中。它们和普通的页的唯一不同就是功能不同。当任务撤销后,它们和任务所占用的普通物理页一样会被回收,并分配给其他任务。 下面我们看一下在多任务环境下,页目录表和页表映射示意图: 需要注意的就是全局地址空间,所有的任务的页目录对应的全局地址空间的那些页目录项,都是一样的,因为所有任务共享全局地址空间。 2、虚拟地址(线性地址)到物理地址的具体变换过程现在有了分页,最简单和最基本的机制就是:CR3寄存器给出了页目录的物理基地址;页目录给出了所有页表的物理地址;而每个页表给出了它所包含的页的物理地址。 上面该清楚的都清楚了,唯一不明白的是,应该如何使用这种层次化结构来把线性地址转换成物理地址。 如下图: 上述图示很清晰,我们这里不再赘述详细的转换过程。 我们唯一需要注意的是:这种变换不是无缘无故的。而是事先安排好的。这其实还是一个反过程: 首先当任务加载时,操作系统先创建虚拟的内存段,并根据段地址的高20位决定它要用到哪些页目录项和页表项。然后寻找空闲的页,将原本应该写入段(因为是虚拟段,所以这里说原本)的数据,写到一个或者多个物理页中,并将页的物理地址填写到相应的页表中。只有这样提前将页表填好,在程序真正执行的时候,才能以相反的顺序,从页表中再取出之前填好的页的物理地址,去相应的物理内存中取指令执行或者找到相应的数据。这就是一个反过程。在上一篇文章中也有类似的过程。 3、总结本文学习了: 页目录、页表和页之间的关系虚拟地址(线性地址)到物理地址的转换过程详细的内容还是要参考原书籍,这里只是做一个简单的总结。 学习探讨加个人: qq:1126137994 微信:liu1126137994 |
CopyRight 2018-2019 实验室设备网 版权所有 |