-
-
[原创]分页模式之我见(简述)
-
2021-6-28 14:22 3757
-
前言
本文是对前两天发的帖子《物理地址、线性地址、逻辑地址之我见》的补充。如有谬误,敬请指正!
基本概念
分页模式从推出至今已有四种模式:32-bit、PAE、4-level 和 5-level。每种模式都与物理地址和线性地址的宽度息息相关。下表截取自 Intel 手册:
分页模式 | 线性地址位宽 | 物理地址位宽 | 页面大小 |
---|---|---|---|
None | 32 | 32 | N/A |
32-bit | 32 | 40 | 4 KB / 4 MB |
PAE | 32 | 52 | 4 KB / 2 MB |
4-level | 48 | 52 | 4 KB / 2 MB / 1 GB |
5-level | 57 | 52 | 4 KB / 2 MB / 1 GB |
上表中物理地址位宽仅为参考值,具体值由 MAXPHYADDR 决定,如何获取 MAXPHYADDR 详见我的另一篇帖子。
格式转换
由于各模式都有两至三种不同大小的页面,因此,线性地址的分割也存在多种格式,虽然如此,但各种格式大同小异。下表简略说明了各格式:
分页模式 | PML5E | PML4E | PDPTE | PDE | PTE | OFFSET | 页面大小 |
---|---|---|---|---|---|---|---|
32-bit | 10 | 10 | 12 | 4 KB | |||
PAE | 2 | 9 | 9 | 12 | 4 KB | ||
4-level | 9 | 9 | 9 | 9 | 12 | 4 KB | |
5-level | 9 | 9 | 9 | 9 | 9 | 12 | 4 KB |
上表仅列举了不同宽度线性地址分割 4 KB 页面的情况,其他尺寸页面的分割只需将 OFFSET 的宽度扩大以覆盖掉最近的表项即可。
在 32 ~ 57 Bits 的线性地址中存在 2 ~ 5 个表,每个表占 4 KB 物理地址,因此,每个表中可存放 1024/512 个表项(4096÷4/4096÷8),唯独 PAE.PDPTE 例外。
顶级表的入口地址总是存在于 CR3 寄存器中。
线性到物理
不知道,各位看官有没有发现,物理地址和线性地址的宽度总是不一样的,也就是说并非一一对应,该死的牙膏厂(Intel)!一次性都 64 Bits 就没有这么麻烦了。
我在早先学习分页时,就被两个地址宽度不一的问题,困扰了很久。后来几经磨砺,才渐渐的明白了其中原委。其实很简单……由于各个表项都是可编程的,管理地址空间的软件(OS),只要不分配或动态调整超出范围的地址即可。
结语
整体而言,分页模式依据线性地址位宽区分,可归纳为两大类 32/48+,其他都是子集而已。
同时,本文并未对每种表的属性,以及,各模式的开关和切换做任何说明,原因有三:1、太麻烦……;2、一些属性我也不清楚具体何用;3、作为入门,以上内容够用,毕竟不是人人都写操作系统。
[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。