前言
在 Linux 内存管理中,页表(pgtable)是一个关键的数据结构,用于管理虚拟内存到物理内存的映射。
页表
页表是操作系统用来存储虚拟地址与物理地址之间映射关系的数据结构。每个进程都有自己的页表,负责将该进程的虚拟地址转换为物理地址。
页表的层级结构
Linux 通常使用多级页表结构,这种结构有效地减少了内存开销。常见的层级有:
二级页表
适用于小内存的系统。
三级页表
用于中等规模的系统。
三级页表示例
对于一个三级页表,虚拟地址可能被分为以下几个部分:
页全局目录(PGD)
顶层,指向下一级的页中间目录(PUD)。
页中间目录(PUD)
中间层,指向页表(PMD)。
页表(PMD)
最底层,指向实际的物理页面。
四级页表
现代 Linux 系统(如 x86_64 架构)通常使用四级页表结构。
页表项(PTE)
每个页表中的条目称为页表项(Page Table Entry, PTE),包含以下信息:
物理页框号(PFN)
指向实际物理页的编号。
有效位
指示该映射是否有效。
权限位
指示读、写、执行权限。
访问位
记录页面是否被访问过。
修改位
记录页面是否被修改过。
页表的作用
地址转换
页表用于将虚拟地址转换为物理地址,当进程访问内存时,CPU 会查找页表以获得相应的物理地址。
内存保护
通过页表,操作系统能够实施内存保护,防止进程访问不属于它的内存区域。
内存共享
页表支持多个进程共享同一物理页面(如共享库),通过适当的映射实现。
页表的管理
创建和维护
当进程创建时,内核会为其分配一个新的页表,并在需要时进行更新和维护。
页表项的更新
当进程请求分配新内存或释放内存时,内核会更新相应的页表项。
缺页异常
当进程访问未映射的虚拟地址时,会触发缺页异常,内核会处理该异常,分配新的物理页面并更新页表。
TLB(Translation Lookaside Buffer)
TLB 是一种缓存,存储最近使用的页表项,以加快地址转换速度。访问 TLB 的时间远低于访问主内存,因此有效地提高了系统性能。