内核必须懂(七): Linux四级页表(x64)
时间: 2023-07-14 09:12:06 浏览: 181
Linux内核中常见内存分配函数
在 Linux x64 中,虚拟地址空间是 2^48 (256 TB)。为了管理这么大的地址空间,Linux 使用了四级页表。
四级页表包含了四个级别的页表,每个页表的大小都是 512 个条目。每个条目的大小为 8 字节,因此一个页表的大小为 4 KB。因此,一个四级页表的大小为 4 KB * 512 * 512 * 512 * 512 = 256 TB。
在四级页表中,虚拟地址被划分为五个部分:PGD(Page Global Directory)、PUD(Page Upper Directory)、PMD(Page Middle Directory)、PTE(Page Table Entry)和偏移量。
- PGD:PGD 是最高级的页表,它包含了 512 个 PUD 条目。
- PUD:PUD 包含了 512 个 PMD 条目。
- PMD:PMD 包含了 512 个 PTE 条目。
- PTE:PTE 包含了物理页框号和一些标志。
- 偏移量:偏移量用于计算物理地址。
当 CPU 访问一个虚拟地址时,它首先使用 PGD 条目找到对应的 PUD 条目,然后使用 PUD 条目找到对应的 PMD 条目,依此类推。最后,CPU 使用 PTE 条目找到对应的物理页框号,并将虚拟地址中的偏移量添加到物理页框号中,得到物理地址。
Linux x64 中的页表是按需分配的。当进程第一次访问某个虚拟地址时,Linux 会分配一个物理页框,并将该页框映射到对应的虚拟地址。如果进程再次访问同一虚拟地址,则直接使用之前分配的物理页框。
这是 Linux x64 中页表的基本原理。理解页表的工作原理对于理解 Linux 内核的内存管理非常重要。
阅读全文