在微内核操作系统的版图中,seL4、Redox 等成熟项目占据了大部分技术视野。然而,一个名为 Anos 的手写微内核项目凭借其约 100KiB 的超小体积与严格的 x86-64、RISC-V 双平台支持,正在开辟一条独特的工程化路径。该项目不仅实现了完整的抢占式多任务调度与用户态驱动模型,更在系统调用接口设计中融入了 capability-based 安全模型,为轻量级操作系统实现提供了值得参考的范式。
非 Zealous 微内核设计哲学
Anos 的核心设计理念体现在「非 zealous」(非极致)微内核定位上。与传统微内核将尽可能多的功能移至用户态不同,Anos 的 STAGE3 微内核保留了五类核心功能:CPU 抽象(x86-64 与 RISC-V)、基础定时器(HPET、TSC、SBI Timers)、中断管理(LAPIC、MSI/MSI-X、S-mode 中断)、物理与虚拟内存管理(48 位虚拟地址空间)、以及线程与进程管理。这些功能无法在用户态安全或可移植地实现,因此保留在内核中是合理的工程权衡。
内存管理方面,内核实现了基于 RLE 栈的物理内存分配器(PMM)、直接映射的分页虚拟内存管理(VMM),以及固定块与 slab 分配器。虚拟地址空间支持 48 位寻址,在 x86-64 和 RISC-V 上保持一致。这种设计使得用户态进程能够通过 syscall 申请虚拟内存映射(anos_map_virtual),内核以延迟分配策略应对,实际物理页可能在页面故障时才真正分配。
双平台系统调用接口设计
Anos 的系统调用接口是理解其架构的关键入口。内核暴露 26 个直接系统调用,覆盖进程管理、内存映射、IPC 通道、中断处理等核心操作。值得注意的是,所有系统调用均通过 capability 进行权限控制,不存在环境变量授权(ambient authority),进程只能持有从父进程继承的能力。
在 x86-64 平台上,系统调用提供两条调用路径:首选路径通过 syscall/sysret 指令实现,这是现代 Intel/AMD 处理器提供的高效特权切换机制;备用路径通过 int 0x69 软件中断实现,用于兼容与调试场景。调用约定使用 r9 寄存器传递 capability token,rdi、rsi、rdx、r10、r8 分别承载五个参数,返回值放在 rax 中。这一约定与 System V ABI 兼容,仅有微小调整:rcx 不用于参数传递且在 syscall 指令执行后被覆盖。
RISC-V 平台则统一使用 ecall 指令进行系统调用,参数通过 a0-a4 传递,capability token 放在 a7 寄存器,返回值在 a0 中。RISC-V 的调用约定完全遵循标准 ABI,简化了编译器层面的适配工作。
从系统调用清单来看,内核刻意保持了功能的极简性。进程创建(anos_create_process)、线程创建(anos_create_thread)、内存映射(anos_map_virtual)与解映射(anos_unmap_virtual)构成了进程模型的核心;IPC 相关的系统调用包括通道创建(anos_create_channel)、消息发送(anos_send_message)、消息接收(anos_recv_message)与回复(anos_reply_message),实现了同步零拷贝消息传递机制。
能力传递与安全模型
Anos 的安全模型建立在 capability 之上,每个系统调用都需要对应的 capability token。进程创建时,父进程可以将自己持有的 capability 子集传递给子进程,传递时可以收窄权限(例如将读写映射能力降级为只读),但无法传递自己不具备的能力。这种设计确保了最小权限原则的贯彻。
用户态的 SYSTEM 超级服务器拥有全部 capability,负责将权限委托给其他服务进程。设备管理器(DEVMAN)获得物理内存映射能力后,可以将 PCI 配置空间映射到用户态,实现真正的用户态驱动。这种设计将传统内核态驱动移至用户空间,同时通过 capability 机制保证安全隔离。
工程实现路径与参数建议
对于希望参考 Anos 实现路径的团队,以下工程参数值得关注。构建系统要求 NASM 2.16+(x86-64 汇编)、QEMU(支持 UEFI 固件)、mtools(FAT 文件系统生成),以及自定义工具链(基于 binutils、GCC 16-experimental、Newlib)。编译目标为 freestanding 模式的内核代码与 hosted 模式的用户态代码。
调度器采用优先级轮转算法,分为四个优先级类别,每类 255 个优先级等级。SMP 支持上限为 16 核心(1 个 BSP + 15 个 AP),当前超过 8 核心时稳定性下降,因为尚未切换到 x2APIC 模式。定时器驱动依赖各架构的本地 APIC 定时器,计划迁移至无时钟中断(tickless)设计以提升能效。
内存分配方面,内核采用静态池策略避免运行时动态分配。虚拟内存映射支持延迟分配,物理页在首次访问时才真正分配。物理内存分配器使用 RLE(Run-Length Encoding)栈结构,适合嵌入式场景的碎片化管理。
调试支持通过 GDB 远程调试实现,建议在调试构建时使用 OPTIMIZE=0 以避免优化导致的调试体验下降。CLion 和 VSCode 均有配套的调试配置模板,降低了开发环境的搭建门槛。
与现有微内核的对比视角
相比 seL4 的形式化验证导向,Anos 更侧重工程实践与双平台可移植性;相比 Redox 的 Rust 实现与完整 POSIX 兼容目标,Anos 坚持非 POSIX 设计并接受手写代码的维护成本。其 100KiB 量级的内核体积(实际为几 MB 含用户态)远小于主流微内核,代价是功能集的高度精简。对于教育资源、嵌入式定制或操作系统教学场景,这种「做减法」的思路提供了有价值的参考。
Anos 的开发状态表明,手写微内核在现代硬件上仍具有可行性。x86-64 版本已能在真实 Haswell 机器上运行,RISC-V 版本在 QEMU 中完成基本功能验证但尚未在真机测试。随着 SMP 支持与设备驱动的完善,该项目有望成为轻量级操作系统探索的又一个代表性案例。
资料来源:Anos 项目 GitHub 仓库(https://github.com/roscopeco/anos)