虚拟内存、页表、物理内存关系
Linux内核把页表分为5级;
1)页全局目录(Page Global Directory,PGD);
2)页四级目录(Page 4th Directory,P4D);
3)页上层目录(Page Upper Directrory, PUD);
4)页中间目录(Page Middle Directory,PMD);
5)直接页表(Page Table,PT);
各种处理器架构可以选择使用五级、四级、三级或者两级页表;同一种处理器架构在页长度不同的情况可能选择不通的页表级数;可以使用CONFIG_PGTABLE_LEVELS配置页表的级数;
内核页游一个页表,0号内核线程的进程描述符init_task的成员active_mm指向内存描述符init_mm,内存描述符init_mm的成员pgd指向内核的页全局目录swapper_pg_dir;
虚拟地址转换成物理地址流程
虚拟地址被分解为6个部分:页全局目录索引、页四级目录索引、页上层目录索引、页中间目录索引、直接页表索引和页内偏移;
查询页表,把虚拟地址转换成物理地址的过程如下:
- 根据页全局目录的起始地址和页全局目录索引得到页全局目录表项的地址,然后从表项得到页四级目录的起始地址;
- 根据页四级目录的起始地址和页四级目录索引得到页四级目录表项的地址,然后从表项中得到页上层目录的起始地址;
- 根据页上层目录的起始地址和页上层目录索引得到页上层目录表项的地址,然后从表项得到页中间目录的起始地址;
- 根据页中间目录的起始地址和页中间目录索引得到页中间目录表项的地址,然后从表项得到直接页表的起始地址;
- 根据直接页表的起始地址和直接页表索引得到页表项的地址,然后从表项得到页帧号;
- 把页帧号和页内偏移组合成物理地址;