虚拟地址空间和物理地址空间是计算机系统中两个重要的概念。虚拟地址空间是由进程使用的地址范围,而物理地址空间是指实际的硬件内存地址范围。在Linux系统中,通过页表的映射机制将虚拟地址空间映射到物理地址空间,实现了进程的内存管理和地址转换。
一、页表和页表项
Linux使用页表(Page Table)来管理虚拟地址和物理地址之间的映射关系。页表是一个层次结构,由多级页表构成,每一级页表负责将一部分虚拟地址映射到物理地址。
在x86架构下,Linux使用了两级页表,一级页表被称为页全局目录表(PGD, Page Global Directory),二级页表被称为页中间目录表(PMD, Page Middle Directory)。页表的最小单位是一个页表项(Page Table Entry),每个页表项存储了虚拟地址和物理地址之间的映射关系,以及一些辅助信息。
二、虚拟地址到物理地址的映射过程
- 初始化页表
在Linux系统启动时,内核会为每个进程创建一个独立的页表。页表的初始化工作由内核负责完成。内核会为每个进程分配一个独立的页全局目录表(PGD),并建立与该页全局目录表相关联的二级页表。
- 虚拟地址到物理地址的转换
当进程访问虚拟地址时,会触发地址转换过程。Linux使用了分页机制,将虚拟地址划分为固定大小的页面(Page),通常为4KB。转换过程如下:
(1)根据虚拟地址的位偏移,找到对应的页全局目录表项(PGD entry)。页全局目录表项中存储了指向页中间目录表的指针。
(2)根据虚拟地址的中间位偏移,找到对应的页中间目录表项(PMD