linux内核学习

页表项(PTE)

image-20251113165506677

拆解后分两部分:

(1) PFN(物理页号)

就是哪个物理页,存放在 PTE 的高 52 位(细节依赖 CPU)。

物理地址 = PFN << 12
(因为每页 4KB)

(2) flag bits(权限/状态位)

常见的标志位包括:

名称 含义
P Present 是否在内存中
R/W 可写 是否允许写
U/S 用户态/内核态 是否允许用户态访问
NX Non-Execute 是否禁止执行
A Accessed 是否被访问
D Dirty 是否被写过
PAT caching mode 缓存策略
Global 全局页 TLB 不会在切换 CR3 时刷新
COW Linux软件层标志 写时复制,内核组织在更高层 meta 信息

这些位让 CPU 知道如何处理对该页的内存访问。

例:
PTE 中 R/W=0 → 页只读
PTE 中 NX=1 → 页不可执行
PTE 中 Present=0 → 页不在内存,引发 page fault,从 swap/load-in 再填充页表

反向映射(RMAP)技术

基本概念

  • 正向映射

    当进程分配内存并发生写操作时,会分配虚拟地址并产生缺页,进而分配物理内存并建立虚拟地址到物理地址的映射关系, 这个叫正向映射。

  • 反向映射

    反过来, 通过物理页面找到映射它的所有虚拟页面叫反向映射(reverse-mapping, RMAP)。

为什么需要反向映射? 主要是为了内存回收。在操作系统中,多个进程的虚拟地址可能映射到同一个物理页(例如共享内存、写时复制等)。当内核需要回收一个物理页时,它必须修改所有映射了该页的页表项,使其无效或指向其他位置。如果没有反向映射,内核将不得不遍历所有进程的页表来寻找映射,这是极其低效的。

Linux2.4没有反向映射
在linux2.4内核中没有反向映射的这个概念,当时为了找到一个物理页面对应的页表项就需要遍历系统中所有的mm组成的链表,然后再遍历每一个mm的每一个vma看这个vma是否映射了这页,这个过程相当低效,最坏情况不得不遍历完所有的mm然后才能找映射到这个页的所有pte。


linux内核学习
http://yzsandw.com/2025/11/13/linux内核学习/
作者
5Y2z
发布于
2025年11月13日
许可协议