starryos
路径:
os/StarryOS/starryos类型:二进制 crate 分层:StarryOS 层 / 启动镜像入口 版本:0.2.0-preview.2文档依据:Cargo.toml、src/main.rs、src/init.sh、.axconfig.toml、.qemu.toml、os/StarryOS/README.md、os/StarryOS/kernel/src/entry.rs、xtask/src/starry/{build.rs,run.rs}
starryos 是 StarryOS 的默认启动镜像包。它不实现 syscall、进程管理或虚拟内存,而是负责把 ax-feat、平台配置、starry-kernel 和默认 init 命令线装配成一个可启动、可进入交互 shell 的系统镜像。
换句话说,starryos 负责的是“把内核打包成一个能启动的 StarryOS 镜像”,而不是“内核本体”。真正的系统核心仍在 starry-kernel。
架构设计
设计定位
从源码和构建链看,starryos 是一个非常薄的入口包,但它承担了 StarryOS 对外最直接的一层职责:
- 选择默认 feature 组合。
- 绑定平台配置与 QEMU 配置。
- 指定默认 init 命令行为。
- 调用
starry_kernel::entry::init()启动真正的内核主线。
因此它更接近“镜像入口”和“系统装配层”,而不是普通应用的 main()。
1.2 feature 与装配关系
Cargo.toml 里的 feature 设计直接决定镜像长什么样:
qemu:二进制[[bin]]的必需 feature,同时启用ax-feat/defplat、ax-feat/bus-pci、ax-feat/display、ax-feat/fs-ng-times,以及starry-kernel的input、vsock、dev-log。smp:启用ax-feat/smp,并在 VisionFive2 平台上联动开启 SMP。vf2:引入可选依赖ax-plat-riscv64-visionfive2,并额外打开ax-feat/driver-sdmmc。
这意味着 starryos 的主要复杂度不在运行时逻辑,而在于“生成哪一类镜像”。
1.3 启动主线
src/main.rs 的逻辑非常短,但它决定了系统如何进入第一个用户进程:
真实代码路径是:
CMDLINE固定为["/bin/sh", "-c", include_str!("init.sh")]。main()把这组静态字符串转成Vec<String>。- 环境变量数组当前为空。
- 调用
starry_kernel::entry::init(&args, &envs),后续工作全部交给starry-kernel。
1.4 默认 init 行为
src/init.sh 明确了这个包的“默认系统人格”:
- 设定
HOME=/root。 - 打印欢迎语和当前环境变量。
- 提示可使用
apk安装软件。 cd ~后执行sh --login。
这说明 starryos 的默认目标是“启动到交互 shell”,而不是跑一组专用测试脚本。
1.5 包级配置文件的作用
这个包目录下除了 main.rs 以外,还有两个重要配置文件:
.axconfig.toml:描述平台和硬件布局,当前默认是riscv64-qemu-virt。.qemu.toml:描述包级 QEMU 参数,当前不带 success/fail 正则。
这与 test-suit/starryos 不同。starryos 是带着本地平台配置和运行配置一起存在的“镜像包”。
1.6 与 starry-kernel 的边界
starryos 不负责下面这些事情:
- syscall 分发和 Linux 错误码。
- 进程/线程、信号、地址空间、文件系统语义。
- 用户程序装载、缺页处理、
fork/exec/wait。
这些都在 starry-kernel。starryos 提供的是入口参数、feature 组合和平台配置。