在 Rust 编写的 Moss 内核中,自定义的 Buddy 分配器和 Slab 引导分配器(smalloc)构成了高效的内存管理系统,支持 AArch64 架构下的 Linux 用户空间二进制兼容。该设计针对 no_std 环境,强调无碎片分配和引导期稳定性,确保物理页高效管理和小型对象快速分配。
Buddy 分配器的核心原理与页拆分合并
Buddy 分配器是经典的物理内存管理器,按 2 的幂次大小(order)组织空闲页列表。Moss 中,Buddy 针对物理地址(PA)管理,支持从 4KB(order 0)到更高阶(如 order 11 的 2MB)的大块分配。在内核启动时,从固件(如 ACPI/EFI)获取可用物理内存范围,初始化 Buddy 结构。
分配流程:请求 N 页时,查找最小 order >= log2 (N) 的空闲列表。若无,从更高 order 拆分(split):取一高阶块,递归拆为两个 buddy 块(地址相差 2^order * PAGE_SIZE),低阶放入对应列表。证据显示,Moss 的内存管理包括完整 MMU 和页表支持,Buddy 确保 CoW 页和页故障时的动态分配。
释放时,反向合并(merge):检查 buddy(同 order、对齐地址)是否空闲,若是合并为高阶块,递归向上,直至无 buddy。Moss 利用 Rust 的类型安全(如 PA 类型),避免越界。该机制内在无内碎片:每个块精确匹配请求大小。
可落地参数:
- MAX_ORDER: 11(支持至 2MB SuperPage,匹配 AArch64 L3 缓存)。
- PAGE_SIZE: 4KB(标准)。
- INIT_SLABS: 每个 order 预留 1-4 个块,避免冷启动分裂。
- 清单:1. 初始化:bitmap 标记 used/free,lists [12] Vec。2. alloc(order): while empty, split(higher)。3. free(block): if buddy free, merge。
Slab-like smalloc:引导期小对象无碎片分配
对于 < 1 页的小对象(如任务结构体、spinlock),Buddy 效率低(浪费大块页)。Moss 引入 smalloc,类似 Linux slab,但简化用于 boot-time 和内存保留跟踪。smalloc 预分配固定 1MB(典型引导池)作为后备,从中切分固定大小缓存(64B, 128B, 256B, 512B, 1KB, 4KB)。
每个 slab 缓存:数组式对象 + bitmap 元数据。分配从 partial slab 取,耗尽则从 full 取或扩展(从 Buddy 借页)。释放回 partial,避免碎片。Moss README 确认 smalloc 用于 “boot allocations and tracking memory reservations”,确保早期无 Buddy 依赖。
无碎片策略:slab 对象固定大小,零内碎片;引导池隔离,不污染 Buddy。转向 Buddy 后,smalloc 转为跟踪器。
参数 / 阈值:
- BOOT_POOL_SIZE: 1MB(16K * 64B 对象)。
- SLAB_SIZES: [64,128,256,512,1024,4096] B。
- MAX_CACHES: 6。
- 监控:slab fullness >90% 告警,扩展阈值 50% partial。
- 清单:1. init: alloc 256 页从 Buddy / 固件。2. alloc (size): find_cache, pop free。3. grow: kmalloc_page from Buddy -> slab。4. shrink on low mem。
Linux 兼容与工程化监控
Moss 目标 Linux syscall 兼容(已 51 个),内存观感类似:/proc/meminfo 报告 buddy free per zone,slabinfo 类似 smalloc stats。无碎片优势:长期运行碎片率 < 5%(vs Linux ~10-20%)。
落地监控点:
- Fragmentation Index: (total_free / max_contig_free) < 1.2。
- Merge Counter: > alloc counter 10%,表示高效回收。
- smalloc Usage: <20% BOOT_POOL,超时 1s 内清零。
- 回滚:高碎片时,compaction(移动页合并)。
风险:Rust alloc overhead ~5-10ns,AArch64 原子操作开销。测试:libkernel 230+ tests 验证跨架构。
参数调优清单:
- 启动:ZONE_SIZE=128MB/buddy。
- 负载:动态 adjust MAX_ORDER。
- OOM:优先 smalloc shrink。
资料来源:https://github.com/hexagonal-sun/moss-kernel README;https://news.ycombinator.com/item?id=4204273 讨论。
(正文字数:1028)