首先,如果内核没有配置高端内存,那么进程页表肯定就是在低端内存了,也就是全部在内核空间了。
在配置了高端内存的情况下,进程页表的pgd,pud,pmd,pte这些,应该放在内核空间的低端内存,还是高端内存,内核空间还是用户空间?由于内核通过cr3能获得全局页目录中的物理地址,由于低端内存的线性映射,内核就能据此算出页目录的虚拟地址,进而实现对页目录的读写,但是,如果所有进程的页表都存放在低端内存,感觉进程一多,低端内存会着不住。而如果页表在用户空间(或在内核空间的非线性映射区),则会因为内核不知道页表的虚拟地址而无法完成对页目录的读写。
接下来来查看代码(4.2内核版本),从x86的__handle_mm_fault入手,里面会对缺页异常进行处理(如分配页目录,页表等):
3314 pud = pud_alloc(mm, pgd, address);
函数执行流:
pud_alloc-->__pud_alloc-->pud_alloc_one
126 static inline pud_t *pud_alloc_one(struct<