二级页表的填充过程:一级页表是4096项(用虚拟地址高12位),二级页表是256项(用虚拟地址中间10位,每个项能代表一个物理页,因此4KB*256=1MB)。因此,每个二级页表映射1MB的空间-物理页。1MB*4096正好也是映射一个进程的4GB内存。
这样看来,一级页表和二级页表的第一阶段映射都是不需要变的。每一个一级页表的映射范围都是1MB。因此在创建二级页表的时候,原先使用的section映射页表还可以继续复用它。
在section映射中,内核镜像区的前16KB保存了页表信息。在两级映射中,也可以继续使用这段空间。采用一级section映射的时候,页表项的每个entry都是某物理区间section的起始地址。采用二级映射后,这里的内容就发生了变化,每个entry的内容将保存的是二级页表的起始地址,二级页表entry中的内容才是真正的保存了物理页帧的起始地址。所以这个阶段会对这段空间进行修改。
二级页表的格式:注意,二级页表映射中,这里第一级页表的低10位是用来对齐的(没理解为啥),因为第二级页表只有10位。如果页表项的后两位是00,表示页表项没有填充。10表示段映射,01表示二级映射。在访问者16KB的内容时,通过这些位判断时属于什么映射。
没看懂,二级页表是如何创建的,如何复用之前内核镜像前的16KB页表空间的!