在 Linux 内核中,PTE(Page Table Entry,页表项) 是页表(Page Table)中的最小单元,用于管理虚拟内存到物理内存的映射。它是多级页表结构(如 x86_64 的四级页表)的最终层级,直接指向物理页帧或存储相关权限信息。
PTE 通常是一个 64 位(8字节) 的数据结构(以 x86_64 为例),包含以下关键信息:
位域 | 含义 |
---|---|
物理页帧号(PFN) |
指向实际物理内存页的基地址(高位掩码)。 |
Present (P) |
1=页在内存中;0=页未加载(触发缺页异常)。 |
Read/Write (R/W) |
1=可写;0=只读。 |
User/Supervisor (U/S) |
1=用户态可访问;0=仅内核态访问。 |
Accessed (A) |
1=页被访问过(用于页面置换算法,如 LRU)。 |
Dirty (D) |
1=页被修改过(需写回磁盘)。 |
Execute Disable (XD) |
1=禁止执行(防范代码注入攻击)。 |
Present=0
时,触发缺页中断,内核需从磁盘加载页面到内存并更新 PTE。Accessed/Dirty
位决定哪些页面可被换出(如 KSM 或 Swap)。R/W=0
的页面会触发段错误(Segmentation Fault)。ptdump
工具或内核配置 CONFIG_PTDUMP
查看页表内容:
bash
# 内核启动参数添加 `ptdump=on`,或通过 SysFS 查看。
arch/x86/include/asm/pgtable.h
(定义 PTE 掩码和操作宏)。mm/memory.c
(处理缺页异常和映射)。通过理解 PTE,可以深入分析 Linux 内存管理行为(如 OOM、缺页性能优化)。如需具体场景的实践分析,可进一步探讨!