ax-page-table-multiarch
路径:
memory/page_table_multiarch类型:库 crate 分层:组件层 / 通用页表引擎 版本:0.6.1文档依据:当前仓库源码、Cargo.toml、README.md、src/lib.rs、src/bits64.rs、src/bits32.rs与相关上层引用路径
ax-page-table-multiarch 是整个仓库中页表抽象最底层的通用实现。它不关心当前是在 ArceOS 内核页表、StarryOS 用户地址空间,还是 Axvisor 嵌套页表场景;它所做的事情是用泛型把“页表元数据”“页表项格式”“页帧分配/物理直映能力”三件事拆开,然后提供统一的建表、映射、撤销、查询、权限修改和 TLB 刷新框架。
架构设计
设计定位
ax-page-table-multiarch 的设计目标是把跨架构页表公共逻辑提炼成一个独立引擎:
- 对内核而言,它是通用页表实现库
- 对 hypervisor 而言,它是构造 NPT/Stage-2/EPT 风格页表的底层积木
- 对上层地址空间管理器而言,它提供可复用的 cursor/map/query 机制
因此它的边界非常清楚:
- 它实现的是“通用树形页表引擎”
- 它不直接负责地址空间策略
- 它不直接实现 VM、进程或 guest 的高级内存管理语义
1.2 三个核心泛型
该 crate 的核心抽象由三个泛型参数组成:
M: PagingMetaDataPTE: GenericPTEH: PagingHandler
它们分别对应三种职责:
| 泛型 | 作用 |
|---|---|
PagingMetaData | 架构元数据:页表层数、地址位宽、TLB 刷新方式、虚拟地址类型 |
GenericPTE | 页表项编码与 flags 语义 |
PagingHandler | OS/运行时依赖:页帧分配、释放、物理到虚拟地址映射 |
这个拆分是本 crate 的设计核心。它让“树形页表遍历逻辑”不必绑定到任何具体架构,也不必绑定到具体内存分配器。
模块结构
| 模块 | 作用 | 关键内容 |
|---|---|---|
lib.rs | 顶层 trait 与公共类型 | PagingMetaData、PagingHandler、PagingError、PageSize、TlbFlusher |
bits64.rs | 64 位页表实现 | PageTable64、PageTable64Cursor、map/query/walk/protect/copy-from |
bits32.rs | 32 位页表实现 | PageTable32、PageTable32Cursor |
arch/* | 架构元数据与类型别名 | x86_64、AArch64、RISC-V、ARMv7、LoongArch64 |
从代码组织上看,这是一个典型的“通用骨架 + 架构适配器”结构。
1.4 PagingMetaData
PagingMetaData 定义了页表引擎必须知道、但又不应该写死在实现中的架构信息:
LEVELSPA_MAX_BITSVA_MAX_BITStype VirtAddrflush_tlb(Option<Self::VirtAddr>)
尤其是 type VirtAddr 很关键。它意味着:
- 页表引擎并不强制把输入地址当成
memory_addr::VirtAddr - 上层完全可以为 EPT、NPT 或 Stage-2 场景绑定自定义的“虚拟侧地址类型”
也正因此,ax-page-table-multiarch 虽然默认以普通页表元数据命名,但天然具备被 axaddrspace 复用到嵌套页表场景的能力。