页式内存管理,内存分成固定长度的一个个页片。操作系统为每一个进程维护了一个从虚拟地址到物理地址的映射关系的数据结构,叫页表,页表的内容就是该进程的虚拟地址到物理地址的一个映射。页表中的每一项都记录了这个页的基地址。通过页表,由逻辑地址的高位部分先找到逻辑地址对应的页基地址,再由页基地址偏移一定长度就得到最后的物理地址,偏移的长度由逻辑地址的低位部分决定。一般情况下,这个过程都可以由硬件完成,所以效率还是比较高的。页式内存管理的优点就是比较灵活,内存管理以较小的页为单位,方便内存换入换出和扩充地址空间。

Linux最初的两级页表机制:

两级分页机制将32位的虚拟空间分成三段,低十二位表示页内偏移,高20分成两段分别表示两级页表的偏移。

PGD(Page Global Directory): 最高10位,全局页目录表索引

PTE(Page Table Entry):中间10位,页表入口索引

当在进行地址转换时,结合在CR3寄存器中存放的页目录(page directory, PGD)的这一页的物理地址,再加上从虚拟地址中抽出高10位叫做页目录表项(内核也称这为pgd)的部分作为偏移, 即定位到可以描述该地址的pgd;从该pgd中可以获取可以描述该地址的页表的物理地址,再加上从虚拟地址中抽取中间10位作为偏移, 即定位到可以描述该地址的pte;在这个pte中即可获取该地址对应的页的物理地址, 加上从虚拟地址中抽取的最后12位,即形成该页的页内偏移, 即可最终完成从虚拟地址到物理地址的转换。从上述过程中,可以看出,对虚拟地址的分级解析过程,实际上就是不断深入页表层次,逐渐定位到最终地址的过程,所以这一过程被叫做page talbe walk。

Linux的三级页表机制:

当X86引入物理地址扩展(Pisycal Addrress Extension, PAE)后,可以支持大于4G的物理内存(36位),但虚拟地址依然是32位,原先的页表项不适用,它实际多4 bytes被扩充到8 bytes,这意味着,每一页现在能存放的pte数目从1024变成512了(4k/8)。相应地,页表层级发生了变化,Linus新增加了一个层级,叫做页中间目录(page middle directory, PMD), 变成:

字段 描述 位数

cr3 指向一个PDPT crs寄存器存储

PGD 指向PDPT中4个项中的一个 位31~30

PMD 指向页目录中512项中的一个 位29~21

PTE 指向页表中512项中的一个 位20~12

page offset 4KB页中的偏移 位11~0

现在就同时存在2级页表和3级页表,在代码管理上肯定不方便。巧妙的是,Linux采取了一种抽象方法:所有架构全部使用3级页表: 即PGD -> PMD -> PTE。那只使用2级页表(如非PAE的X86)怎么办?

办法是针对使用2级页表的架构,把PMD抽象掉,即虚设一个PMD表项。这样在page table walk过程中,PGD本直接指向PTE的,现在不了,指向一个虚拟的PMD,然后再由PMD指向PTE。这种抽象保持了代码结构的统一。

Linux的四级页表机制:

硬件在发展,3级页表很快又捉襟见肘了,原因是64位CPU出现了, 比如X86_64, 它的硬件是实实在在支持4级页表的。它支持48位的虚拟地址空间1。如下:

字段 描述 位数

PML4 指向一个PDPT 位47~39

PGD 指向PDPT中4个项中的一个 位38~30

PMD 指向页目录中512项中的一个 位29~21

PTE 指向页表中512项中的一个 位20~12

page offset 4KB页中的偏移 位11~0

Linux内核针为使用原来的3级列表(PGD->PMD->PTE),做了折衷。即采用一个唯一的,共享的顶级层次,叫PML4。这个PML4没有编码在地址中,这样就能套用原来的3级列表方案了。不过代价就是,由于只有唯一的PML4, 寻址空间被局限在(239=)512G, 而本来PML4段有9位, 可以支持512个PML4表项的。现在为了使用3级列表方案,只能限制使用一个, 512G的空间很快就又不够用了,解决方案呼之欲出。

在2004年10月,当时的X86_64架构代码的维护者Andi Kleen提交了一个叫做4level page tables for Linux的PATCH系列,为Linux内核带来了4级页表的支持。在他的解决方案中,不出意料地,按照X86_64规范,新增了一个PML4的层级, 在这种解决方案中,X86_64拥一个有512条目的PML4, 512条目的PGD, 512条目的PMD, 512条目的PTE。对于仍使用3级目录的架构来说,它们依然拥有一个虚拟的PML4,相关的代码会在编译时被优化掉。 这样,就把Linux内核的3级列表扩充为4级列表。这系列PATCH工作得不错,不久被纳入Andrew Morton的-mm树接受测试。不出意外的话,它将在v2.6.11版本中释出。但是,另一个知名开发者Nick Piggin提出了一些看法,他认为Andi的Patch很不错,不过他认为最好还是把PGD作为第一级目录,把新增加的层次放在中间,并给出了他自己的Patch:alternate 4-level page tables patches。Andi更想保持自己的PATCH, 他认为Nick不过是玩了改名的游戏,而且他的PATCH经过测试很稳定,快被合并到主线了,不宜再折腾。不过Linus却表达了对Nick Piggin的支持,理由是Nick的做法conceptually least intrusive。毕竟作为Linux的扛把子,稳定对于Linus来说意义重大。最终,不意外地,最后Nick Piggin的PATCH在v2.6.11版本中被合并入主线。在这种方案中,4级页表分别是:PGD -> PUD -> PMD -> PTE。

arm linux 页表寻址,操作系统中的页表寻址相关推荐

  1. 【Linux 内核】Linux 操作系统结构 ( Linux 内核在操作系统中的层级 | Linux 内核子系统及关系 | 进程调度 | 内存管理 | 虚拟文件系统 | 网络管理 | 进程间通信 )

    文章目录 一.Linux 内核在操作系统中的层级 二.Linux 内核子系统 三.Linux 内核子系统之间的关系 一.Linux 内核在操作系统中的层级 Linux 内核 所在层级 : 整个计算机系 ...

  2. 操作系统中的页表的结构

    最近在学习操作系统,看到页表时有点晕,不过看了如下资料后就比较清楚了: 一.页表结构 分页转换功能由驻留在内存中的表来描述,该表称为页表(page table),存放在物理地址空间中.页表可看做简单的 ...

  3. 在 Linux“.NET研究” 操作系统中运行 ASP.NET 4 (下)

    "在 Linux 操作系统中运行 ASP.NET 4 (中)"中已经配置好了 openSUSE 11.3 操作系统. 现在,我们进入"GNOME 终端",使用 ...

  4. 凤凰系统运行linux,在Deepin操作系统中安装凤凰系统(Phoenix OS)的方法

    以下讲解在Deepin 15.7操作系统中安装凤凰系统(版本是PhoenixOSInstaller_v3.0.6.479_x86_x64.iso),安装方法完全可以借鉴Ubuntu安装凤凰系统(Pho ...

  5. 在win7系统上装linux,在Windows操作系统中安装Linux系统

    很多人对我写下面的东西已不屑一看了,但我写这个帖子的原因是:很多在Windows下想安装Linux的人不知如何开始,如何下手安装.等进入到安装界面又出现了很问题.不得不中途放弃. 好了,从我做起,开始 ...

  6. 在Linux和Windows操作系统中socket program的兼容问题

    2019独角兽企业重金招聘Python工程师标准>>> 1.头文件  windows下winsock.h或winsock2.h linux下netinet/in.h(大部分都在这儿) ...

  7. linux 混音处理 arm,alsa移植到arm linux嵌入式系统中

    1  alsa-lib的移植 1.1  软件包下载 alsa-lib库:进入网站http://www.alsa-project.org/选择下载,在这里下载的是alsa-lib-1.0.22.tar. ...

  8. arm linux 进程调度,详解ARM Linux 2.4.x进程调度

    Linux2.4.x是一个基于非抢占式的多任务的分时操作系统,虽然在用户进程的调度上采用抢占式策略,但是而在内核还是采用了轮转的方法,如果有个内核态的线程恶性占有CPU不释放,那系统无法从中解脱出来, ...

  9. arm linux 开机电路_ARM Linux启动过程分析

    摘 要: 嵌入式 Linux 的可移植性使得我们可以在各种电子产品上看到它的身影.对 于不 同体系结构的处理器来说 Linux 的启动过程也有所不同. 本文以 S3C2410 ARM 处理器为例, 详 ...

最新文章

  1. 重磅:2019年全国普通高校学科竞赛排行榜出炉!
  2. “厌氧动物”出现,科学家不清楚代谢方式,或颠覆对生命的认知
  3. BCI比赛数据集简介-BCI competition IV 2b
  4. mybatis configuration的内容必须匹配问题
  5. ASP.NET AJAX(开发代号:Atlas)的相关问题请在本帖中提出
  6. [LintCode] Trailing Zeroes 末尾零的个数
  7. 飞鸽传书2011看到一篇国外的博客
  8. javascript耐人寻味
  9. Javascript第六章prototype原型向构造器中添加属性,实现构造器共享,节约空间第五课
  10. Activity使用Intent启动另一个Activity
  11. 刷机出现未将对象引用设置到对象的实例是什么意思_Java 虚拟机 2:Java 内存区域及对象简单理解...
  12. EverNote 极致的免费笔记资料管理软件 (数据网络同步、支持PC、Mac与手机多平台) 转自:http://www.iplaysoft.com/evernote.html
  13. 014:针对mdk中STM32程序无法使用printf,产生停留BEAB BKPT 0xAB处问题的解决(转)
  14. 「经济读物」经济学通识
  15. Java学习经典《第一行代码》第二版
  16. 4.4亿赎金,6800GB数据窃取,勒索病毒攻击到底怎么防?
  17. Unity游戏实战项目-英雄无敌
  18. 微信小程序商城怎么在线制作
  19. P30鸿蒙ota升级,MotoP30 摩托罗拉P30 XT1943-1 线刷包 救砖解锁 CN_OPEN_USER_Q00020.0_O_ZUI_4.0.249...
  20. 【Latex】TexLive+VScode+SumatraPDF 配置LaTex编辑环境

热门文章

  1. RouterOS计划任务实例
  2. 按键精灵手机版去除广告XPosed模块插件
  3. sed中支持变量的处理方法
  4. yii2.0框架debug模式
  5. EF CodeFirst下的自动迁移
  6. shell 实现txt转换成html
  7. windows--reg--向注册表中写入一些数据
  8. 场景切换时清理缓存!!CCTextureCache、CCSpriteFrameCache、CCAnimationCache
  9. 软考信息系统项目管理师_信息系统安全管理---软考高级之信息系统项目管理师026
  10. AndroidStudio安卓原生开发_UI控件_Spinner用法_下拉选择框---Android原生开发工作笔记100