由于内核在不同的CPU上运行,甚至包括目前的64位机器。Linux内核提供了4级页表的管理机制,它可以兼容各种架构的CPU。
一个虚拟地址会被分为5个部分:页全局目录PGD(Page Global Directory),页上级目录PUD (Page Upper Directory),页中间目录PMD(Page Middle Directory,页表PT (Page Table)以及 偏移量offset,其中的表项叫页表项PTE(Page table entry)。也就是说一个线性地址中除去偏移量,分别存放了4级目录表项的索引值。
具体的线性地址翻译成物理地址的过程是:
(1)首先从进程地址描述符中(mm_struct)中读取pgd字段的内容。它就是页全局目录的起始地址;
(2)然后,页全局目录起始地址+页全局目录索引---->页上级目录的起始地址;
(3)页上级目录+页上级目录索引---->页中间目录的起始地址;
(4)页中间目录的起始地址+页中间目录的索引---->页表起始地址;
(5)页表起始地址+索引---->页表项;
(6)从页表项中取出物理页的基址,加上偏移量可以得到最终的物理地址。
以2级页表管理机制做一个原理性的说明,4级页表管理类似:
2级页表管理机制原理:
对于4级页表管理机制:
那么线性地址