ax-allocator 技术文档
路径:
components/axallocator类型:库 crate 分层:组件层 / 分配算法基础件 版本:0.2.0文档依据:Cargo.toml、README.md、src/lib.rs、src/bitmap.rs、src/buddy.rs、src/slab.rs、src/tlsf.rs、tests/allocator.rs
ax-allocator 是一个“统一接口下的多种分配算法库”。它提供页级、字节级和 ID 分配的 trait 与若干实现,供 ax-alloc、ax-dma 等上层模块挑选和组合。它属于叶子基础件:负责算法和接口,不负责全局分配器注册、锁保护、内存发现或地址空间策略。
1. 架构设计分析
1.1 设计定位
ax-allocator 解决的是“如何把不同分配算法放到同一套接口下复用”:
- 通过
BaseAllocator、ByteAllocator、PageAllocator、IdAllocator定义统一抽象。 - 通过 feature 选择具体算法实现,而不是在运行时做动态分派。
- 通过可选
allocator_api适配 nightlyAllocatortrait,便于在主机侧做压力测试。
因此,这个 crate 不是全局分配器,也不是内存管理器;它更像“可插拔分配算法工具箱”。
1.2 模块划分
src/lib.rs:公共 trait、错误类型、feature 导出,以及AllocatorRc适配器。src/bitmap.rs:基于bitmap-allocator的页级分配实现。src/buddy.rs:对buddy_system_allocator的薄包装。src/slab.rs:对ax_slab_allocator的薄包装。src/tlsf.rs:对rlsf的 TLSF 实现包装。
1.3 关键接口与实现
BaseAllocator:定义init()与add_memory()两个基础入口。ByteAllocator:字节级申请/释放与统计接口。PageAllocator:页级申请/释放、定点页分配和页统计接口。IdAllocator:唯一 ID 分配接口;当前仓库里接口已定义,但本 crate 里没有现成实现。AllocError/AllocResult:统一错误模型;启用ax-errno后可转换成AxError。
1.4 具体算法特征
BitmapPageAllocator<const PAGE_SIZE: usize>:- 适合页级位图管理。
- 支持
alloc_pages()与alloc_pages_at()。 - 容量由
page-alloc-256m/4g/64g/1tfeature 决定。 add_memory()当前明确不支持,直接返回AllocError::NoMemory。
BuddyByteAllocator:- 基于
buddy_system_allocator::Heap<32>。 - 优点是简单直接,能给出总量/已用统计。
- 基于
SlabByteAllocator:- 适合固定对象尺寸较多的场景。
- 通过
Option<Heap>保存底层实例,必须先init()。
TlsfByteAllocator:- 使用
rlsf::Tlsf<'static, u32, u32, 28, 32>。 - 通过
multilevel segregated fit追求稳定分配复杂度。 - 手工维护
total_bytes与used_bytes统计。
- 使用