ax-hal
路径:
os/arceos/modules/axhal类型:库 crate 分层:ArceOS 层 / ArceOS 内核模块 版本:0.3.0-preview.3文档依据:Cargo.toml、src/lib.rs、src/dtb.rs、src/mem.rs、src/percpu.rs、src/irq.rs、src/paging.rs、src/tls.rs、build.rs、linker.lds.S
ax-hal 是 ArceOS 家族中最关键的“硬件抽象粘合层”。它并不试图独立实现所有架构/平台逻辑,而是把 ax-cpu 的 ISA 语义、axplat 的平台实现和上层运行时需要的统一接口收束成一套稳定的 HAL 边界,因此它既是 ax-runtime 的启动基座,也是 ax-mm、ax-task、StarryOS 与 Axvisor 共同复用的低层能力入口。
架构设计
设计定位
ax-hal 处在 三层之间:
- 向下连接
ax-cpu与选中的axplat-*平台 crate,分别承接 ISA 级抽象和平台事实;默认平台实现是axplat-dyn。 - 向上为
ax-runtime、ax-mm、ax-task、ax-driver等模块提供统一 API。 - 通过
AX_PLATFORM_CRATE选择平台实现,并通过功能 feature 控制 IRQ、分页、TLS、SMP、用户态等能力。
这意味着 ax-hal 的核心价值不是“算法复杂”,而是“边界清晰”与“初始化顺序正确”。它本质上是 ArceOS 运行时的硬件语义总入口。
模块结构
src/lib.rs:顶层聚合与 feature 门控。决定是链接真实平台 crate,还是链接dummy平台以支持cargo test。src/dummy.rs:无真实平台时的占位实现。通过axplat接口提供 no-op 或unimplemented!()行为,主要用于宿主侧测试构建。src/dtb.rs:管理 boot argument、FDT 解析与chosen.bootargs读取,负责把启动参数从引导阶段传给后续模块。src/mem.rs:整合链接符号、平台物理内存范围和 MMIO 区域,生成统一的memory_regions()视图,并负责.bss清零。src/percpu.rs:每 CPU 局部状态入口,维护当前任务指针并复用ax_plat::percpu提供的 CPU 本地能力。src/time.rs:时间相关能力的再导出层,把时钟源、计时器和时间转换统一暴露给上层。src/irq.rs:IRQ 处理桥接层,负责 trap handler 注册、IRQ hook、与ax_plat::irq的派发对接。src/paging.rs:页表处理桥接层,向ax-page-table-multiarch提供PagingHandlerImpl,并在不同 ISA 下导出统一的页表类型。src/tls.rs:内核态 TLS 布局与TlsArea管理,仅在tlsfeature 启用时进入构建。build.rs+linker.lds.S:生成选中平台 crate 的导入代码、SMP build info,并配合链接路径完成内核段布局。
1.3 关键数据结构与全局对象
BOOTARG:保存引导阶段传入的参数,后续由 DTB/FDT 解析流程读取。ALL_MEM_REGIONS:统一后的物理内存区域视图,是ax-alloc、ax-runtime等模块做内存初始化的基础。CURRENT_TASK_PTR:每 CPU 当前任务指针,供调度与上下文切换路径读取。IRQ_HOOK:可注册的 IRQ 钩子,用于平台 IRQ 分发前后的附加处理。CPU_NUM:在smp场景下,由平台运行时发现结果决定最终可用 CPU 数。PagingHandlerImpl:把页表帧申请/释放与地址翻译能力接到上层页表实现中。TlsArea:内核态线程局部存储块管理对象,仅在 TLS 打开时参与主线。