hello-kernel 技术文档
路径:
components/axplat_crates/examples/hello-kernel类型:平台样例内核 crate 分层:组件层 /axplat最小 bring-up 示例 版本:0.1.0文档依据:Cargo.toml、src/main.rs、Makefile、README.md
hello-kernel 是 axplat 工作区里最短的“能真正跑起来”的内核样例。它显式链接一个目标平台包,调用 ax_plat::percpu::init_primary()、ax_plat::init::init_early() 和 init_later(),然后打印启动信息、忙等 5 秒并关机。
因此它最重要的边界是:它不是可复用内核框架,也不是上层系统应该直接继承的骨架;它只是验证 axplat 最小启动链是否成立的样例入口。
1. 架构设计分析
1.1 最小内 核主线
源码只有一个文件,但结构非常清晰:
- 通过
cfg_if!选择当前架构对应的平台 crate。 init_kernel(cpu_id, arg)完成 per-CPU 与平台初始化。#[ax_plat::main] fn main(...) -> !打印信息、忙等、关机。panic_handler在 panic 时走控制台输出并关机。
它几乎把“基于 axplat 写最小内核”压缩到了最短。
1.2 真实调用链
这个顺序非常重要,因为它展示了 axplat 使用者最基本的职责分工:
- 平台 crate 提供启动入口与板级实现
- 示例内核负责在进入主逻辑前按顺序完成平台抽象要求的初始化
1.3 为什么要显式 extern crate 平台包
这里没有默认平台自动选择逻辑,而是按架构显式链接:
ax-plat-x86-pcax-plat-aarch64-qemu-virtax-plat-riscv64-qemu-virtax-plat-loongarch64-qemu-virt
这说明它本质上是 axplat 平台包 的最小消费者,用来证明平台包已经具备最小 bring-up 能力。
2. 核心功能说明
2.1 实际演示的能力链
这个样例实际覆盖的是:
- 启动入口成功跳到
#[ax_plat::main] - BSP 的 per-CPU 状态已建立
- 控制台与时间源可用
busy_wait可以推进时间- 关机路径
system_off()可用
2.2 为什么只做 busy_wait
这里不用调度器、不用文件系统、不用中断,是刻意缩短故障面。只要这份样例都跑不通,就说明问题还在更底层:
- 平台启动入口
- 串口
- 时间源
- 电源关机路径
2.3 边界澄清
这份样例不是:
- ArceOS 的应用入口
ax-runtime的替代品- 可直接扩展成完整内核的通用 骨架
它只是 axplat 平台包的最小消费者。
3. 依赖关系图谱
3.1 直接依赖
axplat:对外暴露统一的平台抽象接口。cfg-if:按架构切换平台 crate。- 各平台包:提供真正的板级实现。
3.2 关键间接依赖
ax-plat-macros:支撑#[ax_plat::main]。ax-cpu、串口/时钟相关底层组件:由平台包继续下接。
3.3 主要消费者
axplat平台包的 bring-up 验证。- 新平台接入时的第一条最短运行路径。
irq-kernel、smp-kernel之前的基础烟雾测试。