第十学 linux内核——内存寻址——分页机制(2)

时间:2021-09-05 06:15:08

        前面我们提到linux是如何把程序的逻辑地址通过摒弃段机制直接映射到线性地址空间,这节我们讨论linux如何实现线性地址到物理地址的映射。

        我们强调过linux如何致力于做出一个强大的可移植系统。linux为了可移植,采用了三级分页模式,以支持一些64位机。于是linux定义了以下三种类型的页表:

        页总目录(PGD)、页中间目录(PMD)、页表(PT)。linux的三级分页看起来是这样:(图片来自《linux操作系统原理与应用(陈莉君)》)

第十学 linux内核——内存寻址——分页机制(2)

        跟我们前边提到的两级分页原理一样。

        x86是支持两级目录的,那如果我们要把linux的三级分页模式移植到这样一个结构上要怎么做呢?

        linux同样有非常巧妙的办法。

        我们说每一个进程都有自己的页目录和页表集,当进程切换发生时,linux把CR3控制寄存器的内容保存在前一个执行进程的PCB中,然后把下一个进程PCB中CR3的值装入CR3,这样我们就能正确的找到自己在物理内存中的地址。

        linux把PMD(页中间目录)看做只有一项的表,并把它存在PGD表项中,页表的中间目录被巧妙的折叠到页表总目录中,从而适应二级页表。