分页机制
分页机制是用“页“来管理线性地址空间和物理地址空间。x86架构典型的页大小是4KB,也允许大于4KB的页面大小,此处不展开赘述。一个4GB的虚拟地址空间可以划分为1024×1024个页面。
分页机制的核心思想是通过页表将线性地址转换为物理地址,配合TLB旁路转换缓冲区来加速地址转换过程。分页机制主要由页表、CR3寄存器和TLB三个部件构成。
二级页表对应着4KB大小的页面
一级页表和二级页表区别?
一级页表结构:
需要连续完整的页表映射整个虚拟地址空间,每个虚拟页都需要一个页表项,每个进程在启动时都要预先分配整个页表。每个页4KB,因此需要低12位表示页内偏移。剩余高20位表示页号,共有2^20个页表项。每个页表项都能表示4KB的页,因此总共能映射的内存空间是4GB。
二级页表结构:
一个二级页表项的[31:22]索引页目录项,总共能索引1024个页目录项(页目录从CR3中读取),每个页目录项都对应了一个页表,所以一个页目录能对应1024个页表。根据二级页表的[21:12]索引到页表项,页表大小为210,一个页表项对应了一个页。根据二级页表项的偏移[11,0],能索引到4KB大小页的物理地址。所以一个二级页表项能表示210 *210 *212字节大小的内存。
为什么二级页表比一级页表更加节省地址空间?
下面是CSAPP原文:
第一,如果页目录(一级页表)中的一个PDE是空的,那么相应的二级页表就不会存在。对于典型的进程,4GB的虚拟地址空间不部分都是未分配的。第二,只有一级页表总是存在主存中,二级页表可以在需要时被创建、调入内存,减少了主存的压力。只有经常使用的二级页表会被存在缓存中。
二级页表页表项结构:
a) 页目录项PDE。页目录项存放在页目录中,CPU使用线性地址的22~31位索引页目录,以获得该线性地址对应的页目录项。每个页目录项位4B大小,所以每个页目录占用4KB大小的物理页面,共包含1024页目录项。下图为PDE的32位数据
b) 页表项PTE。页表项存在页表,CPU使用线性地址的12~21位索引页表,以获得该线性地址对应的页表项。页表项位4B大小,页表包含1024个页表项,占用4KB页面。下图位PTE的32位数据
其中P字段使得虚拟内存实现,P的取值代表两种情况:
P=1:物理页面存在物理内存中,CPU完成地址转换后,可以直接访问该页面。
P=0:页面不在物理内存中,当CPU访问该页面时会产生一个缺页错误并交给操作系统的缺页错误处理程序处理。P=0时页目录项、页表项变为下图的格式:
CPU在索引页目录之前,必须知道页目录所在的物理地址,页目录的物理地址存放在CR3寄存器中,也成为页目录基地址寄存器。一个进程在运行前,必须将其页目录的基地址存入CR3。