组件开发指南
TGOSKits 的核心价值不仅在于将各仓库整合到同一工作区,更在于使开发者能够从组件出发,追踪其在 ArceOS、StarryOS 和 Axvisor 中的实际使用方式。本文档介绍 TGOSKits 的多层组件架构、改动影响评估、验证路径选择,以及将新组件接入三套系统的标准流程。
若已知目标 crate 的名称,建议配合 组件概述 阅读本文档:本文档侧重说明"组件处于哪一层、通常影响哪些系统",而组件概述负责回答"它依赖哪些包、文档入口在哪里"。
1. 组件层次结构
新开发者常见的误解是:只有 components/ 下的目录才算组件。实际上,TGOSKits 包含六类组件化层次,每一层均有其职责定位和消费者群体。理解这些层次的划分,对于评估改动影响范围和选择验证路径至关重要。
下表总结了六类组件层次的路径、职责、典型内容与主要消费者:
| 路径 | 角色 | 典型内容 | 主要消费者 |
|---|---|---|---|
components/ | subtree 管理的独立可复用 crate | ax-errno、ax-kspin、axvm、starry-process | 三套系统都可能直接或间接使用 |
os/arceos/modules/ | ArceOS 内核模块 | ax-hal、ax-task、ax-net、ax-fs | ArceOS,且经常被 StarryOS 和 Axvisor 复用 |
os/arceos/api/ | feature 与对外 API 聚合 | ax-feat、ax-api | ArceOS 应用、StarryOS、Axvisor |
os/arceos/ulib/ | 用户侧库 | ax-std、ax-libc | ArceOS 示例与用户应用 |
os/StarryOS/kernel/ | StarryOS 内核逻辑 | syscall、进程、内存、文件系统 | starryos 包 |
os/axvisor/ | Hypervisor 运行时与配置 | src/、configs/board/、configs/vms/ | Axvisor |
除上述六类核心组件层次外,以下两个目录在验证组件功能和系统集成时也需关注:
platforms/*:平台实现test-suit/*:系统级测试入口
2. 组件依赖关系
理解组件的依赖流向对于评估改动影响范围至关重要。以下流程图展示了从可复用 crate 到最终系统的典型路径:
上述流程图表示常见的三种组件依赖路径:
-
纯复用 crate 直接被系统包依赖
例如components/starry-process、virtualization/axvm -
先经过 ArceOS 模块层,再被上层系统消费
例如ax-hal、ax-task、ax-driver、ax-net -
通过平台和配置接到最终系统
例如内置动态平台platforms/axplat-dyn、外部自定义ax-plat-*兼容包、Axvisor 的configs/board/*.toml
2.1 依赖统计
仓库内 148 个 crate 之间的内部有向边共 533 条,最大层级 16。
| 分类 | 数 |
|---|---|
| ArceOS 层 | 30 |
| Axvisor 层 | 2 |
| StarryOS 层 | 2 |
| 工具层 | 2 |
| 平台层 | 2 |
| 测试层 | 17 |
| 组件层 | 93 |
2.2 详细依赖数据
3. 改动定位
在开始修改前,需首先明确改动所属的层次及其影响的系统范围,以便选择合适的开发位置和验证策略。下表根据功能类型推荐了优先查看的位置和常见影响面:
| 你要改什么 | 优先看哪里 | 常见影响面 |
|---|---|---|
| 通用基础能力:错误、锁、页表、Per-CPU、容器 | components/axerrno、components/kspin、memory/page_table_multiarch、components/percpu | 三套系统都可能受影响 |
| ArceOS 内核服务:调度、HAL、驱动、网络、文件系统 | os/arceos/modules/*、drivers/*,以及相关 memory/* / platforms/* | ArceOS,且可能波及 StarryOS / Axvisor |
| ArceOS 的 feature 或应用接口 | os/arceos/api/axfeat、os/arceos/ulib/axstd、os/arceos/ulib/axlibc | ArceOS 应用与上层系统 |
| StarryOS 的 Linux 兼容行为 | components/starry-*、os/StarryOS/kernel/* | StarryOS |
| Hypervisor、vCPU、虚拟设备、VM 管理 | virtualization/axvm、virtualization/axvm-types、virtualization/*_vcpu、virtualization/axdevice、virtualization/axvisor_api、os/axvisor/src/* | Axvisor |
| 平台、板级适配或 VM 启动配置 | platforms/*、os/axvisor/configs/* | 一到多个系统 |
若不确定某个 crate 的维护者或来源仓库,可查看 scripts/repo/repos.csv,该文件记录了所有 subtree 组件的来源信息。
4. 组件修改与验证
修改已有组件时,推荐采用渐进式验证策略:从最小的消费者开始,逐步扩大验证范围,最后补充统一测试。该方法既能快速发现问题,又能避免在无关测试上浪费时间。
4.1 定位最近的消费者
建议先明确以下信息:
- 该 crate 被哪些包直接依赖
- 影响范围是单个系统还是多个系统
- 是否存在比"启动整套系统"更轻量的验证入口
通常可先查看相关 Cargo.toml,再选择最小运行路径。
4.2 最小验证路径
根据改动位置的不同,推荐的验证路径也有所差异:
| 改动位置 | 第一步验证 | 第二步验证 |
|---|---|---|
components/axerrno、components/kspin、components/ax-lazyinit 这类基础 crate | cargo test -p <crate> | cargo xtask arceos run --package arceos-helloworld --arch riscv64 |
os/arceos/modules/* | cargo xtask arceos run --package arceos-helloworld --arch riscv64 | 需要功能时换成 arceos-httpserver --net 或 arceos-shell --blk |
components/starry-*、os/StarryOS/kernel/* | cargo xtask starry run --arch riscv64 --package starryos | cargo starry test qemu --target riscv64 |
virtualization/axvm、virtualization/axvm-types、virtualization/*_vcpu、virtualization/axdevice、os/axvisor/src/* | cd os/axvisor && cargo xtask build | 准备好 Guest 后运行 ./scripts/setup_qemu.sh arceos,再执行 cargo xtask qemu --build-config ... --qemu-config ... --vmconfigs ... |
4.3 补充统一测试
完成最小路径验证后,若改动涉及跨系统基础组件,还需运行统一测试以确保不会破坏其他系统:
cargo xtask test
cargo arceos test qemu --target riscv64gc-unknown-none-elf
cargo starry test qemu --target riscv64
cargo axvisor test qemu --target aarch64
若修改的是跨系统基础组件,至少应执行以下测试:
- 一条宿主机/
std路径 - 一条 ArceOS 路径
- 一条该组件实际影响到的系统路径
5. 新增组件
新增组件时,首先应确定其所属层次,然后按照标准模板创建目录和配置文件。正确的初始结构设计能够显著降低后续维护和集成的成本。
5.1 确定所属层次
首先需明确新 crate 应属于哪一层:
- 真正可复用的独立 crate:放
components/ - 仅属于 ArceOS 的 OS 模块:放
os/arceos/modules/ - 仅属于 ArceOS 的 API 或用户库:放
os/arceos/api/或os/arceos/ulib/ - 仅属于 StarryOS / Axvisor 的系统内部逻辑:优先放对应系统目录
5.2 标准目录结构
确定层次后,按以下标准结构创建组件目录。以下为 components/ 下独立 subtree crate 的推荐模板:
my_component/
├── Cargo.toml # Crate 元数据和依赖配置
├── rust-toolchain.toml # Rust 工具链配置
├── LICENSE # 许可证文件
├── CHANGELOG.md # 版本变更日志(可选)
├── README.md # 项目简介(英文)
├── README_CN.md # README 中文版(可选)
├── .cargo/
│ └── config.toml # Cargo 配置(默认 target、编译选项等)
├── .github/
│ ├── workflows/
│ │ ├── check.yml # 代码检查工作流
│ │ ├── test.yml # 测试工作流
│ │ ├── deploy.yml # 文档部署工作流
│ │ └── release.yml # 发布工作流
│ └── config.json # 项目配置文件
├── scripts/ # 实用脚本
│ ├── check.sh # 代码检查(调用 axci/check.sh)
│ └── test.sh # 测试(调用 axci/tests.sh)
├── tests/ # 集成测试文件
└── src/ # 组件源码目录
└── lib.rs # 库入口,导出公共 API
注意:如果组件仅作为 TGOSKits 内部原型,不需要立即添加
.github/、scripts/、tests/等 subtree CI 相关文件。只有在组件准备作为独立 subtree 仓库长期维护时才需要补齐。
5.3 配置文件模板
Cargo.toml
[package]
name = "my_component"
version = "0.1.0"
edition = "2024"
authors = ["作者"]
description = "组件描述"
license = "Apache-2.0"
repository = "https://github.com/org/repo"
keywords = ["os", "component"]
categories = ["embedded", "no-std"]
[dependencies]
在 TGOSKits 工作区内,更推荐直接复用根工作区的配置:
[package]
name = "my_component"
version = "0.1.0"
edition.workspace = true
[dependencies]
.github/config.json
CI/CD 流程读取的组件配置文件:
{
"targets": [
"aarch64-unknown-none-softfloat"
],
"rust_components": [
"rust-src",
"clippy",
"rustfmt"
]
}
| 字段 | 说明 |
|---|---|
targets | 编译目标平台列表 |
rust_components | 需要安装的 Rust 组件 |
.cargo/config.toml
[target.aarch64-unknown-linux-gnu]
linker = "aarch64-linux-gnu-gcc"
runner = ["qemu-aarch64", "-L", "/usr/aarch64-linux-gnu"]
rust-toolchain.toml
[toolchain]
profile = "minimal"
channel = "nightly-2025-05-20"
components = ["rust-src", "llvm-tools", "rustfmt", "clippy"]
targets = ["aarch64-unknown-none-softfloat"]