linux内核学习
页
页表项(PTE)

拆解后分两部分:
(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内核学习/