ax-page-table-entry
路径:
memory/page_table_entry类型:库 crate 分层:组件层 / 页表项编码层 版本:0.6.1文档依据:当前仓库源码、Cargo.toml、README.md、src/lib.rs与src/arch/*
ax-page-table-entry 是多 架构页表栈里专门负责“页表项长什么样”的基础库。它不负责遍历页表树、不负责分配页表页,也不负责地址空间策略;它只把不同架构的 PTE/descriptor 编码抽象成统一接口,使上层 ax-page-table-multiarch、axaddrspace、axplat-* 引导页表和 ax-cpu 等组件都能在不重复理解每套硬件位语义的前提下构造和查询页表项。
架构设计
设计定位
该 crate 在页表体系中的职责边界非常清楚:
ax-page-table-entry:定义页表项格式与 flags 编码ax-page-table-multiarch:实现页表树、cursor、map/query/unmapaxaddrspace/ax-mm:组织地址空间与映射策略
因此它的核心价值是“架构相关的位级定义统一化”,而不是高层内存管理。
模块结构
| 模块 | 作用 | 关键内容 |
|---|---|---|
lib.rs | 顶层统一抽象 | MappingFlags、GenericPTE、PhysAddr |
arch/mod.rs | 架构分派 | 条件编译各架构子模块并导出公共类型 |
arch/x86_64.rs | x86_64 页表项 | X64PTE 与 PageTableFlags 转换 |
arch/aarch64.rs | AArch64 页表项 | A64PTE、DescriptorAttr、MemAttr |
arch/arm.rs | ARMv7 页表项 | A32PTE 与 short-descriptor 风格编码 |
arch/riscv.rs | RISC-V 页表项 | Rv64PTE 与 PTEFlags |
arch/loongarch64.rs | LoongArch64 页表项 | LA64PTE 与对应 flags |
1.3 通用权限模型:MappingFlags
MappingFlags 是本 crate 的第一核心抽象。它用统一位语义表达:
READWRITEEXECUTEUSERDEVICEUNCACHED
这组 flags 不是任何单一架构原样存在的硬件位,而是“上层能够理解的通用映射语义”。随后,每个架构子模块都负责把它转换成各自的原生 PTE/descriptor 标志组合。
这层抽象的意义在于:
- 上层不需要重复关心 NX/PXN/UXN、AttrIndx、PAT、PTEFlags 等差异
- 不同内存子系统之间可以共享同一套权限语言