ax-memory-set 技术文档
路径:
components/axmm_crates/memory_set类型:库 crate 分层:组件层 / 地址区间集合与映射元数据层 版本:0.4.1文档依据:当前仓库源码、Cargo.toml、README.md、src/lib.rs、src/area.rs、src/backend.rs、src/set.rs
ax-memory-set 是 ArceOS/StarryOS/Axvisor 这条内存管理链上的“区间集合与操作骨架”。它不直接实现页表,也不直接决定物理页如何分配,而是围绕“若干不重叠地址区间”和“这些区间应如何映射”提供统一的数据结构与操作流程。可以把它理解为一层抽象的 mmap/munmap/mprotect 元数据引擎:上层负责地址空间语义,下层 Backend 负责真正操作页表。
1. 架构设计分析
1.1 设 计定位
该 crate 解决的是一个非常具体的问题:
- 如何维护一组不重叠的虚拟地址区间
- 如何对这些区间执行 map/unmap/protect
- 如何把“区间操作”与“页表实现”解耦
因此它属于“内存区间元数据层”,而不是“完整虚拟内存子系统”。
1.2 模块划分
| 模块 | 作用 | 关键内容 |
|---|---|---|
lib.rs | 顶层导出和错误定义 | MappingError、MappingResult |
backend.rs | 后端抽象 | MappingBackend |
area.rs | 单个区间对象 | MemoryArea<B> |
set.rs | 多区间集合管理 | MemorySet<B> |
tests.rs | 回归测试 | MockBackend 与典型操作路径 |
1.3 MappingBackend:与具体页表解耦的关键
MappingBackend 是整个 crate 的设计中心。它把真正的页表操作下沉到实现方,只保留三个核心动作:
mapunmapprotect
并通过关联类型把三类关键信息延后绑定:
AddrFlagsPageTable
这意味着 ax-memory-set 完全不需要知道:
- 地址究竟是
VirtAddr还是GuestPhysAddr - flags 究竟是普通页权限还是嵌套页表权限
- 页表究竟是宿主页表、进程页表还是 EPT/NPT 封装
1.4 MemoryArea<B>:单段连续映射描述
MemoryArea<B> 由三部分组成:
va_rangeflagsbackend
它描述“一段连续地址区间以某种权限和某种后端方式被管理”。这里最关键的设计是:一个区间不仅有范围和权限,还有自己的 backend 实例。这使同一地址空间中的不同区域可以在逻辑上挂接不同后端策略。
MemoryArea 提供的高阶能力包括:
map_areaunmap_areaprotect_areasplitshrink_leftshrink_right
后面三个操作是 munmap/mprotect 这类区间切分逻辑的核心。
1.5 MemorySet<B>:以 BTreeMap 组织的不重叠区间集合
MemorySet<B> 的内部结构是:
- 以区间起始地址为 key 的
BTreeMap
选择 BTreeMap 的原因很直接:
- 需要有序管理区间
- 需要支持按地址查找最近的前驱区间
- 需要支持扫描空洞、寻找可用区域
它公开的核心操作是:
overlapsfindfind_free_areamapunmapprotectclear
1.6 关键算法主线
map
map 的典型路径为:
- 检查参数与区间合法性
- 检查是否与已有区间重叠
- 若允许覆盖,则先做区间级
unmap - 调用
backend.map()真正建立映射 - 将新区间插入
BTreeMap