PFN 与 folio:vmemmap 双向换算
MMU 的部分一笔带过:CPU 访问 VA,硬件走四级页表 pgd→pud→pmd→pte 取出 PTE,PTE 的 OA 字段就是 PFN。本页演示软件侧的两个方向:正向拿着柜号查账本,反向拿着账本指针反算柜号。
VA ──MMU 四级页表(硬件自动, 略)──▶ PTE ──取 OA 字段──▶ PFN ⇄ folio (本页主角)
物理内存(金库,按 PFN 编号的储物柜,柜里是用户数据)
vmemmap(登记簿,struct page 数组,PFN 就是下标)
| mapping | 归属对象,最低位是类型标签(1=匿名 0=文件) |
| index | 页在映射里的偏移;rmap 用它反推这页在每个映射它的进程里各自的 VA(父子进程算出的不同) |
| flags | 冷热两位计数器 · PG_dirty · PG_swapbacked |
| lru | 挂 lruvec 链表的节点 |
| _refcount | 几个地方在用我(归 0 才能释放) |
| _mapcount | 几个 PTE 指着我(-1 = 无人映射) |