【从头开始写操作系统系列】页表以及相关的描述符详解

在之前的文章中,我们介绍过 GDT(全局描述符表)以及一致代码段和非一致代码段,这篇文章我们再回到描述符,这次我们来以 ARM 架构为例了解一下页表描述符。

在这篇文章中,我们会看到以下内容:

  • 页表是什么?
  • 一级页表的地址变换过程
  • 由一级描述符来获取二级描述符或者段地址的过程

页表

页表是什么?

页表是一种特殊的数据结构,放在系统空间的页表区,存放逻辑页与物理页帧的对应关系。 每一个进程都拥有一个自己的页表,PCB表中有指针指向页表。

(来自百度百科

通俗的来讲,页表的内容就是一个描述符(关于描述符的介绍请参看该系列文章中的《实现一个 GDT》),我们可以将 GDT 理解成为一个一级描述符表,将 LDT 理解为一个二级描述符表。这篇文章我将以 ARM 体系结构为例,介绍一级页表的地址变换过程以及根据一级页表的类型来获取二级描述符表或者段的物理地址。

MMU 中的地址变换

ARM 系统中的虚拟空间到物理存储空间的映射是以内存块为单位进行的,即虚拟内存中的一块连续的空间被映射到物理存储空间一段连续的地址空间。

ARM 支持以下几种大小的存储块:

  • 段(Section):大小为1MB
  • 大页(Large Pages):大小为64KB
  • 小页(Small Pages):大小为4KB
  • 微页(Tiny Pages):大小为1KB

在页表中,每一个地址变换条目实际上记录了一个虚拟空间的存储块的基地址与物理空间存储块的对应关系,根据存储块的大小,会有多种不同的地址变换。

在 ARM 中,MMU 实现虚拟地址到物理地址的映射是通过两级页表来实现的(以段为单位的地址变换是通过一级页表实现的)

ARM 中与 MMU操作相关的寄存器

寄存器 作用
C1 配置 MMU 中的一些操作
C2 保存页表的基地址
C3 设置域的访问控制属性
C4 保留
C5 内存访问失效状态指示
C6 内存访问失效时失效的地址
C8 控制与清除 TLB 内容相关操作
C10 控制与锁定 TLB 内容相关操作

一级页表

如何获得一级页表的地址?

从上表中我们可以看到 C2中保存了页表的基地址,由此,我们可以看到下图:

一级页表地址 = C2寄存器的高18位 + 虚拟地址的高22位 + 00 (共32位)

一级描述符

我们得到了一级页表的地址,对应地址空间的内容就是一级描述符。

一级描述符分为以下类型:

  • 粗粒度页表描述符

  • 段描述符

  • 细粒度页表描述符

从以上三幅图中我们可以看到,不同类型的描述符是由描述符的最低2位决定的,分别为:

类型 低1位 低0位
粗粒度页表描述符 0 1
段描述符 1 0
细粒度页表描述符 1 1
无效 0 0

获得二级描述符表或者段地址过程

由粗粒度页表描述符获得二级描述符表

从图中我们可以清楚的看到由粗粒度描述符表得到二级描述符表地址的过程:

二级描述符表地址 = 粗粒度描述符表高22位 + 虚拟地址[19:12]位 + 00 (共32位)

由细粒度页表描述符获得二级描述符表

从图中我们可以清楚的看到由细粒度描述符表得到二级描述符表地址的过程:

二级描述符表地址 = 粗粒度描述符表高20位 + 虚拟地址[19:10]位 + 00 (共32位)

由段描述符表描述符获得段的物理地址

从图中我们可以清楚的看到由段描述符表描述符获得段的物理地址的过程:

段物理地址 = 段描述符高12位 + 虚拟地址低20位

总结

在这篇文章中,我们加深了之前对描述符的理解,同时对描述符的作用做了更直接的解释,对于页表也进行了介绍。这篇文章中我们以 ARM 体系结构为例讲解了二级页表的工作,其实,按照同样的道理我们也可以设计出三级页表以及更多级的页表。


本文的版权归作者 罗远航 所有,采用 Attribution-NonCommercial 3.0 License。任何人可以进行转载、分享,但不可在未经允许的情况下用于商业用途;转载请注明出处。感谢配合!

时间: 2024-08-28 14:39:51

【从头开始写操作系统系列】页表以及相关的描述符详解的相关文章

【从头开始写操作系统系列】一致代码段与非一致代码段

上几篇文章,我们一直在讨论的都是 GDT 相关的一些问题,现在我们知道在系统在从实模式向保护模式跳转时,GDT 是必须要准备的结构.在介绍这一跳转之前,这篇文章我们来介绍两个概念:一致代码段和非一致代码段. 首先,我们先来看几个问题: 一致代码段和非一致代码段是什么? 为什么要有一致代码段和非一致代码段? 系统提供怎样的机制来使用户程序访问内核数据? 程序如何在段与段之间跳转? 接下来,我们将讨论上述这些问题. 特权级 为了更好的理解之后的问题,我们先来讨论一个概念:特权级. 特权级是一种机制来

非常好!!!【从头开始写操作系统系列】实现一个-GDT(1)【转】

转自:http://blog.csdn.net/luoyhang003/article/details/47338019 权声明:本文为博主原创文章,未经博主允许不得转载.(文章来源:http://blog.luoyuanhang.com) 目录(?)[-] 介绍 GDT GDT 是什么 描述符结构 在这篇文章中我们完成了以下内容: 介绍 GDT 介绍段描述符 实现一个段描述符 介绍 GDT GDT 是什么? GDT(Global Descriptor Table)是一种数据结构,用来提供段式存

【从头开始写操作系统系列】实现一个-GDT(1)

在这篇文章中我们完成了以下内容: 介绍 GDT 介绍段描述符 实现一个段描述符 介绍 GDT GDT 是什么? GDT(Global Descriptor Table)是一种数据结构,用来提供段式存储机制,这种机制是通过段寄存器和 GDT 中的描述符共同提供的. 在保护模式下,虽然现在的寄存器已经有32位的,但是我们依旧采用『段:偏移』的形式来寻址,只不过『段』的概念就相当于 GDT,段值仍然由16位的 cs.ds 等寄存器表示,但是这时段值仅仅是相当于一个索引,指向一个数据结构,这个数据结构就

【从头开始写操作系统系列】环境搭建以及第一个Hello World

写在最前 笔者在动手写此操作系统时是一名大学本科大二的学生,可能文章中会有好多地方我没有解释清楚,可能也会有许多地方出现错误,我恳请各位读者能提出质疑和纠正我的错误,谢谢! 参考书籍: <30天自制操作系统>川合秀实 <ORANGE'S:一个操作系统的实现> 开发环境 笔者采用以下开发环境 Apple Macbook Air Ubuntu 12.04 LTS(32 bit) 读者准备 毕竟是动手写一个操作系统,对读者的要求也会相应要求高一些,对计算机编程0基础的读者还是不建议直接看

【从头开始写操作系统系列】使用 Bochs 调试操作系统

在上一篇文章<环境搭建以及第一个Hello-World>中,笔者讲了如何安装 bochs 以及运行一个 helloworld 操作系统,但是使用上一篇文章中的方法安装的 bochs 是不支持调试的,下面我讲介绍如何使用源码编译的方法来安装 bochs,以及使用 bochs 来调试操作系统. 编译安装 Bochs 下载 bochs 源码 http://sourceforge.net/projects/bochs/files/bochs/2.6.8/ 解压之后进入该目录,进行配置 sudo ./c

LINUX下ORACLE相关的内核参数详解

ORACLE相关的内核参数详解 1.kernel.sem [[email protected] ~]# cat /proc/sys/kernel/sem 250         32000    100         142 [[email protected] ~]#  ipcs -sl ------ Semaphore Limits -------- max number of arrays = 142 max semaphores per array = 250 max semaphor

分享一位国外大牛写的不规则物体像素级碰撞检测算法及详解

最近在做一个有关投篮的小游戏,需要用到像素级碰撞检测,as3自带的hitTestObject显然无法满足需要.网上搜寻了一下,在9ria挖坟挖到两篇好文章: 分享一个超高效的不规则物体碰撞检测的类~~ [Lii]超高效的不规则物体碰撞检测<效率优化> 第一篇文章介绍了一位国外大牛写的不规则物体像素级碰撞检测算法,原理是用bitmap绘制两对象不透明区域,利用混合模式计算出两对象的相交区域. 第二篇文章则在该算法的基础上进行了效率的优化,原理是判断出两对象发生hitTestObject碰撞后,将

Kintinuous 相关论文 Volume Fusion 详解

近几个月研读了不少RGBD-SLAM的相关论文,Whelan的Volume Fusion系列文章的效果确实不错,而且开源代码Kintinuous结构清晰,易于编译和运行,故把一些学习时自己的理解和经验写出来,供大家参考,同时希望各位批评指正. 研读之前已经发现有中文博客做了一些解析,我也受益不少.参见fuxingyin的blog:Kintinuous 解析 .不过有些地方已经不够详细,故此文重新进行解读.可能某些地方会重复. 本文是在自己阅读.整理.代码实践的基础上做的一些结果,希望对相关研究者

(转)写的非常好的一篇HTTP协议详解

原文地址:http://www.cnblogs.com/TankXiao/archive/2012/02/13/2342672.html#3931004(推荐看原文,因为原文文章末有更详细链接) 当今web程序的开发技术真是百家争鸣,ASP.NET, PHP, JSP,Perl, AJAX 等等. 无论Web技术在未来如何发展,理解Web程序之间通信的基本协议相当重要, 因为它让我们理解了Web应用程序的内部工作. 本文将对HTTP协议进行详细的实例讲解,内容较多,希望大家耐心看.也希望对大家的