Linux内核源码分析 (B.x)Linux页表的映射
一、ARM32页表
1、页表术语
- 在Linux内核源码中会用到PDG、PUD、PMF和PT等简称,但在ARM芯片手册上会使用L1、L2、L3等术语
2、虚拟地址到物理地址转换
- 针对两级级页表而言,这里的
L1
索引和L2
索引分别对应于PGD
(全局目录)和PT
(页表项) - ARM32中的一级页表项和二级页表项大小均为4个字节
3、一级页表项
- 如果只需要支持超级大段和段映射,那么只需要一级页表即可。如果要支持
4KB
页面或64KB
大页映射,那么需要用到二级页表。不同大小的映射,一级或二级页表中的页表项的内容也不一样
- 00:缺页,虚拟存储空间没有被映射到物理存储空间,因而访问该存储空间将产生缺页异常。
- 01:包含了粗粒度的二级页表的物理地址,它可以实现以大页和小页为单位的地址映射
- 10:段描述符(Section Descriptor),段描述符定义了对应的
1MB
的虚拟存储空间的地址映射关系 - 11:包含了细粒度的二级页表的物理地址,
- 关于段映射,更多请看,其实段映射跟页表映射的流程是差不多的,博客里面的段内偏移地址可以类比于页表中的VPO(Virtual Page Offset),下面展示别的博客里的图。
4、二级页表项
二、ARM64页表
1、ARMv8-A架构
- 为什么不是64根地址线?
- 因为48根地址线就已经足够了(
2^48=256T
),再增加地址线只会增加系统的复杂度
2、4KB大小页+4级映射
三、Linux内核中关于页表的函数和宏
1、查询页表
2、判断页表项的状态
3、修改页表
四、研究实例
- ARM32不是只有两级页表吗,为什么要需要遍历这么多?
- ARM32的二级页表没有用到
PTE_SPECIAL
标志位,而ARM64的三级页表中用到了。
五、ARM32页表和Linux页表解惑
1、ARM32页表和Linux页表
- 实现了两套平行页表
- HW(HardWare)页表 ,属于ARM32架构的页表
- SW(SoftWare)页表,属于Linux内核的页表
2、ARM32的PTE页表项和Linux页表不一样
六、其他实例问题