前面我们提到linux是如何把程序的逻辑地址通过摒弃段机制直接映射到线性地址空间,这节我们讨论linux如何实现线性地址到物理地址的映射。
我们强调过linux如何致力于做出一个强大的可移植系统。linux为了可移植,采用了三级分页模式,以支持一些64位机。于是linux定义了以下三种类型的页表:
页总目录(PGD)、页中间目录(PMD)、页表(PT)。linux的三级分页看起来是这样:(图片来自《linux操作系统原理与应用(陈莉君)》)
跟我们前边提到的两级分页原理一样。
x86是支持两级目录的,那如果我们要把linux的三级分页模式移植到这样一个结构上要怎么做呢?
linux同样有非常巧妙的办法。
我们说每一个进程都有自己的页目录和页表集,当进程切换发生时,linux把CR3控制寄存器的内容保存在前一个执行进程的PCB中,然后把下一个进程PCB中CR3的值装入CR3,这样我们就能正确的找到自己在物理内存中的地址。
linux把PMD(页中间目录)看做只有一项的表,并把它存在PGD表项中,页表的中间目录被巧妙的折叠到页表总目录中,从而适应二级页表。