Conversation
… and user library layers
ZR233
left a comment
There was a problem hiding this comment.
已按当前 head 2176f8b964abd6d6cde5862a704173fea8e31c9d 重新审查。
重点看了 ax-feat 删除后的 feature 接线、axbuild Rust/C app feature 归一化、Starry/axvisor/ArceOS build config 迁移、scripts/test/std_crates.csv、ax-runtime/ax-std/ax-libc/ax-task 的能力转发,以及旧 feature 名在活跃路径中的残留情况。未发现阻塞合入的问题。
验证情况:
- GitHub CI run
28772804498对应当前 head,结论为 success,28 个实际 job success,28 个按矩阵条件 skipped。 git merge-tree --write-tree origin/dev origin/pr/1513基于最新origin/dev(1fba35ab66...)无冲突。git diff --check origin/dev...HEADcargo test -p axbuild(703 passed)cargo xtask clippy --package ax-runtime(24/24 passed)cargo xtask clippy --package ax-std(42/42 passed)cargo xtask clippy --package ax-libc(19/19 passed)cargo xtask clippy --package ax-task(16/16 passed)
另外看了 open PR 重叠面:#1451 与本 PR 在 ax-runtime、ax-task、旧 axfeat 等路径有较大重叠,#1016 也触碰 axtask 调度路径;这不是当前 PR 的 correctness blocker,但后合入的一侧需要 rebase/解决冲突。
There was a problem hiding this comment.
总体评价
本 PR 是一个精心设计的架构清理,消除了 ax-feat 中间聚合层,将 feature 所有权分散到各职责 crate。实现严格遵循 PR body 中的设计方案,代码质量高,无实际缺陷。
变更概要
- 删除
ax-featcrate:os/arceos/api/axfeat/整个目录已删除,根Cargo.toml中 workspace dependency 已移除 - Feature 重命名:
sched-rr→rr,sched-cfs→cfs(ax-task、ax-std同步更新)fs-ext4→ext4,fs-fat→fat(ax-runtime)ext4fs→ext4,fatfs→fat(ax-std、ax-libc)aic8800-wifi→aic8800(ax-runtime、ax-driver)dummy-if-not-enabled→stubs(ax-api)
- 删除不必要 feature:
ax-runtime/dma(只是paging别名)ax-fs-ng/std(空 feature)、ax-fs-ng/times(行为默认启用)ax-task/stack-canary(并入multitask)、ax-task/sched-fifo(FIFO 默认)ax-hal/axvisor-linker(无真实消费路径)starry-kernel/sg2002-wifi(聚合 feature)
- 新增 feature:
ax-runtime/uspace、ax-runtime/lockdep、ax-std/vsock、ax-std/aic8800、ax-std/tracepoint-hooks、ax-std/usb、ax-libc/poll - axklib 从 optional 改为 mandatory:
ax-runtime默认依赖axklib - 192 文件变更:覆盖所有 StarryOS/Axvisor/LKM app 构建配置以及 axbuild 构建系统
验证结果
| 检查项 | 结果 |
|---|---|
cargo fmt --check |
✅ 通过 |
cargo check -p ax-runtime --no-default-features |
✅ 通过 |
cargo check -p ax-std --no-default-features |
✅ 通过 |
cargo check -p starry-kernel --no-default-features |
✅ 通过 |
cargo check -p ax-std --features "fs,ext4,net,irq,multitask" |
✅ 通过 |
残留 ax-feat/axfeat 引用(非 CHANGELOG) |
✅ 无残留 |
[patch.crates-io] 检查 |
✅ 无引入 |
CI 状态
CI 运行了 check suite 77757856773(Detect changed paths 触发的路径过滤矩阵):
- Check formatting / run_host: ✅ success
- Run spin-lint / run_container: ✅ success
- Run sync-lint / run_container: ✅ success
- Test arceos loongarch64 qemu / run_host: ✅ success
- Test axvisor self-hosted board orangepi-5-plus-linux / run_host: ✅ success
- 其余 job 因路径过滤/matrix 互斥正常 skipped(
run_host/run_container二选一,publish 仅 main 分支触发)
第二个 check suite 77757781364 全部 skipped,属于 CI 路径过滤的预期行为。
重复/重叠分析
- 搜索
repo:rcore-os/tgoskits type:pr state:open ax-feat仅返回本 PR,无重叠或冲突的开放 PR - 基础分支
dev上无等效行为或更新的 feature 实现
评审结论
本 PR 实现质量高,严格遵循设计方案,所有本地验证通过,CI 通过部分正常。无阻塞性问题。建议合并。
Powered by deepseek-v4-pro
There was a problem hiding this comment.
总体评价
本 PR 消除了 ax-feat 中间聚合层,将 28 个纯转发 feature 按职责分散到各层 crate。实现严格遵循 PR body 中的设计方案,变更覆盖 192 个文件,包括底层模块、runtime、API 暴露层、用户库接口层、StarryOS/Axvisor/LKM 上层系统、axbuild 构建系统和文档。代码质量高,无阻塞性问题。
变更概要
- 删除
ax-featcrate:os/arceos/api/axfeat/整个目录已删除,根Cargo.toml中 workspace dependency 已移除 - Feature 重命名:
sched-rr→rr,sched-cfs→cfs,ext4fs/fatfs→ext4/fat,aic8800-wifi→aic8800,dummy-if-not-enabled→stubs - 删除不必要 feature:
ax-runtime/dma、ax-fs-ng/std、ax-fs-ng/times、ax-task/stack-canary、ax-task/sched-fifo、ax-hal/axvisor-linker、starry-kernel/sg2002-wifi - 新增 feature:
ax-runtime/uspace、ax-runtime/lockdep、ax-std/vsock、ax-std/aic8800、ax-std/tracepoint-hooks、ax-std/usb、ax-libc/poll axklib从 optional 改为 mandatory:ax-runtime默认依赖axklib
验证结果
| 检查项 | 结果 |
|---|---|
cargo fmt --check |
✅ 通过 |
cargo clippy -p ax-runtime --all-features -- -D warnings |
✅ 通过 |
cargo test -p axbuild |
✅ 703 passed |
残留 ax-feat/axfeat 引用(非 CHANGELOG) |
✅ 无残留 |
[patch.crates-io] 检查 |
✅ 无引入 |
CI 状态
GitHub Actions CI(check suite 77757856773)已通过。关键 job 状态:
- Check formatting: success
- Run spin-lint: success
- Run sync-lint: success
- Test arceos loongarch64 qemu: success
- Test axvisor self-hosted board orangepi-5-plus-linux: success
其余 job 因路径过滤/matrix 互斥正常 skipped,属于预期行为。CI 已通过,无需本地再跑一遍完整 QEMU 测试。
重复/重叠分析
- PR #1451(Starry IRQ runtime refactor):与 #1513 在
ax-runtime、ax-task、ax-std、ax-libc等路径有较大重叠,都涉及删除ax-feat引用和 feature 重命名。但 #1451 的 primary focus 是 IRQ runtime 重构(HardIrqWaker、WaitQueue 修复等),#1513 是全面的 feature 架构重组。后合入的一侧需要 rebase 解决 feature 名冲突,但不是 correctness blocker。 - PR #1016(work-stealing for SMP):仅触碰
axtask调度路径,与 #1513 的 feature 重命名(sched-rr→rr等)有轻微触达,无语义冲突。 - 基础分支
dev上无等效行为或更新的 feature 实现。本 PR 是唯一的ax-feat消除方案。
评审结论
本 PR 实现质量高,严格遵循设计方案,格式化/裁剪/clippy 全部通过,CI 通过,无残留旧 feature 引用,无 [patch.crates-io] 引入,无阻塞性问题。建议合并。
Powered by deepseek-v4-pro
Rename `ext4`→`ext4fs`, `fat`→`fatfs`, `cfs`→`sched-cfs`, `rr`→`sched-rr`, `aic8800`→`aic8800-wifi`, and `stubs`→`dummy-if-not-enabled` across all crates, configs, and tests to avoid ambiguity and use more descriptive names. Also remove the redundant `sg2002-wifi` kernel feature in favor of direct `ax-runtime/aic8800-wifi` enablement.
# Conflicts: # os/arceos/modules/axfs-ng/src/block_runtime/device.rs
There was a problem hiding this comment.
总体评价
本 PR 已由 ZR233 和 mai-team-app 在 commit 2176f8b9 上完成 3 次 APPROVE 审查。最新 commit 5b8615544 仅包含文档更新(docs: update feature flag names across documentation for consistency),将文档中的 ax-feat 引用同步为 ax-runtime,与代码变更保持一致。
验证结果
| 检查项 | 结果 |
|---|---|
cargo fmt --check |
✅ 通过 |
cargo clippy -p ax-runtime --all-features -- -D warnings |
✅ 通过 |
cargo clippy -p ax-std --all-features -- -D warnings |
✅ 通过 |
cargo clippy -p ax-libc --all-features -- -D warnings |
✅ 通过 |
cargo clippy -p ax-task --all-features -- -D warnings |
✅ 通过 |
ax-feat/axfeat 残留(非 CHANGELOG) |
✅ 无残留 |
[patch.crates-io] 检查 |
✅ 无引入 |
CI 状态
GitHub Actions check suite 77777713750(run 28779765137):
- Check formatting / run_host: ✅ success
- Run spin-lint / run_container: ✅ success
- Run sync-lint / run_container: ✅ success
- Cancel stale CI runs: ✅ success
- Detect changed paths: ✅ success
- 其余 job 因 matrix 互斥、branch 限制(publish 仅 main)、路径过滤正常 skipped
- 部分 board 自托管测试仍在运行中,格式化/lint 关键检查已通过
重复/重叠分析
- PR #1451(Starry IRQ runtime refactor)与本 PR 在
ax-runtime、ax-task路径有重叠,但方向不同:本 PR 是全面 feature 架构重组,#1451 聚焦 IRQ runtime。后合入一侧需 rebase 解决冲突。 - PR #1016 仅触碰
axtask调度路径,无语义冲突。 - 基础分支
dev无等效实现。
评审结论
本 PR 实现质量高,严格遵循设计文档,格式化/clippy 全部通过,CI 关键检查通过,无残留旧 feature 引用,无 [patch.crates-io] 引入。最新文档更新 commit 与主体变更保持一致。建议合并。
Powered by deepseek-v4-pro
…aming Rename the `ext4fs` feature to `ext4` across starry-kernel Cargo.toml, all `#[cfg(feature = "ext4fs")]` sites (loop device, loop_block, mount), LKM crates (hello, kprobe_test), the starryos binary, and documentation. Also adds an untracked design document (p.md) for ArceOS feature ownership redesign.
… shorter naming
There was a problem hiding this comment.
总体评价
本 PR 消除了 ax-feat 中间聚合层,将 28 个纯转发 feature 按职责分散到各层 crate。变更覆盖 177 个文件,包括删除 ax-feat crate、所有 ax-feat/* 引用迁移为直接 ax-runtime/* 引用、ax-runtime feature 增强(ipi/net/display/input/uspace/lockdep/stack-guard-page wiring)、axklib 从 optional 改为 mandatory、以及所有 StarryOS/Axvisor/LKM app 构建配置更新。实现严格遵循 PR body 中的设计方案,代码质量高,无阻塞性问题。
验证结果
| 检查项 | 结果 |
|---|---|
cargo fmt --check |
✅ 通过 |
cargo check -p ax-runtime --no-default-features |
✅ 通过 |
cargo check -p ax-std --no-default-features |
✅ 通过 |
cargo check -p starry-kernel --no-default-features |
✅ 通过 |
cargo check -p ax-libc --no-default-features |
✅ 通过 |
ax-feat/axfeat 残留(非 CHANGELOG) |
✅ 无残留 |
[patch.crates-io] 检查 |
✅ 无引入 |
CI 状态
GitHub Actions CI(run 28832934391,check suite 77939221210 + 77939225110):
- Detect changed paths / run_host: ✅ success
- Cancel stale CI runs / run_host: ✅ success
- 其余 job 因路径过滤、matrix 互斥(run_host/run_container 二选一)、branch 限制(publish 仅 main)正常 skipped。属于 path-filter 预期行为。
重复/重叠分析
- PR #1451(Starry IRQ runtime refactor):与 #1513 在
ax-runtime、ax-task、ax-std、ax-libc等路径有较大重叠,都涉及删除ax-feat引用。但 #1451 的 primary focus 是 IRQ runtime 重构(HardIrqWaker、WaitQueue 修复等),#1513 是全面的 feature 架构重组。后合入的一侧需要 rebase 解决 feature 名和 Cargo.toml 冲突,但不是 correctness blocker。 - PR #1016(work-stealing for SMP):仅触碰
axtask调度路径,与 #1513 的 feature 重命名(sched-rr/sched-cfs)有轻微触达,无语义冲突。 - 基础分支
dev上无等效行为或更新的 feature 实现。本 PR 是唯一的ax-feat消除方案。
评审结论
本 PR 实现质量高,严格遵循设计方案,格式化/裁剪全部通过,CI 关键检查通过,无残留旧 feature 引用,无 [patch.crates-io] 引入,无阻塞性问题。建议合并。
Powered by deepseek-v4-pro
ZR233
left a comment
There was a problem hiding this comment.
当前 head 4d8d8117f40fa5907f1cae4171ff9978858a1604 我重新看了增量和检查结果。完整 CI 已通过:format/sync/spin lint、clippy、std、ArceOS 四架构 QEMU、Starry 四架构 QEMU、Axvisor QEMU/self-hosted/board、Starry board 等当前覆盖项均为 pass;重复的大矩阵本地验证我没有再跑。
代码侧 feature 迁移和 ext4fs/fatfs 到 ax-fs-ng 内部 ext4/fat 的传播没有看到新的阻塞;ax-runtime 保留上层 ext4fs/fatfs facade 看起来也是兼容性取向。
阻塞点在文档:组件图谱把已删除的 ax-feat 机械改成第二个 ax-runtime,还指向不存在路径并留下自依赖/重复依赖,正好会误导这个 PR 要澄清的 feature 分层。请先修正或重新生成这些组件文档后再合入。
| | `ax-driver` | ArceOS 层 | `drivers/ax-driver` | 15 | 10 | [查看](../architecture/driver/overview) | | ||
| | `ax-errno` | 组件层 | `components/axerrno` | 0 | 36 | [查看](crates/ax-errno) | | ||
| | `ax-feat` | ArceOS 层 | `os/arceos/api/axfeat` | 16 | 7 | [查看](crates/ax-feat) | | ||
| | `ax-runtime` | ArceOS 层 | `os/arceos/api/feature` | 16 | 7 | [查看](crates/ax-runtime) | |
There was a problem hiding this comment.
这里不能把已删除的 ax-feat 行机械替换成第二个 ax-runtime。当前文档同时列出 os/arceos/modules/axruntime 和不存在的 os/arceos/api/feature 两个 ax-runtime,layers.md 里也留下了 level 13 的 ax-runtime、Top-level feature selection for ArceOS 以及 ax-runtime 依赖/被依赖自己的假边。这个 PR 的核心就是澄清 feature 分层,合入前需要把 ax-feat 的节点删除或重新生成组件图谱,避免发布一份错误的依赖文档。
ArceOS Feature 归属重设计:消除聚合层,按职责分层
目标
重新建立 ArceOS feature 的职责层级,使 feature 关系直接、简单、可审计。最终状态应满足:
范围边界
本方案为 breaking change。以下行为属于本次范围:
ax-featcrate 及所有ax-feat/*/axfeat/*feature 前缀。以下行为显式排除,不在本次范围内:
cargo metadata校验脚本。AxFeat分支。axtestfeature +cfg(axtest)的双层机制(feature 控制 test target,custom cfg 控制源码)。背景与动机
ax-feat是一个 28 个 feature 的纯转发 crate,无自身源码。它的存在导致三个核心问题:ax-std/smp实际启用哪些底层模块,需读ax-feat、ax-runtime、ax-hal三层 Cargo.toml 才能确定。ax-feat/net声明["paging", "irq", "multitask", ...],ax-runtime/net也有自己的前置条件声明,两层之间存在隐式依赖且无人保证一致。ax-driver、ax-runtime、ax-feat、ax-std四处注册,且每处的前置条件声明需手动保持同步。设计原则
Feature 保留判定
一个 feature 只有满足以下任一条件才应保留:
fs、net、display、input、multitask。ax-fs-ng/ext4、ax-fs-ng/fat、ax-task/rr、ax-task/cfs。ax-api/fs、ax-posix-api/net、ax-std/fs。smp、irq、fp-simd、hv、uspace、xuantie-c9xx。lockdep、backtrace、dwarf、stack-guard-page、stack-protector。以下情况不应作为 feature:
ax-fs-ng/std。cfg站点,仅为转发其他 crate 的 feature,例如ax-feat/*。multitask的默认调度器、stack canary 是multitask的基础防护,不应单独暴露 feature。Feature 命名约定
smp、irq、ipi、tls、rtc、dma、hv。ext4、fat)、调度算法(rr、cfs)、协议/设备型号(virtio-net、aic8800)。fs-ext4/fs-fat,用ext4/fat。stack-protector、virtio-net。跨层同名 Feature 架构约束
Cargo feature 名是 per-crate 的;不同 crate 下的同名 feature 在 Cargo 层面互不相同。
ax-api/fs、ax-runtime/fs、ax-std/fs是三个独立 feature,仅名字相同。本方案有意允许同名 feature 跨层存在,表达同一能力的不同职责切面:
ax-api/fs:控制 Rust 文件 API 符号是否编译。ax-runtime/fs:控制 runtime 是否初始化 block driver、VFS、rootfs。ax-std/fs:用户库 feature 入口,组合上述两层。约束:调用关系必须通过各 crate 的
Cargo.toml显式映射审计,禁止跨 crate 推断等价性。同一能力的跨层 feature 关系只能通过Cargo.toml中的["ax-runtime/fs"]这类显式声明传递。优化后各层 Feature 清单
应删除或默认化的 Feature
ax-feat/*axfeat/*ax-fs-ng/stdax-fs-ng/timesax-runtime/times/ax-std/times/ax-libc/timesax-runtime/dmapaging别名,runtime 没有独立 DMA 初始化路径ax-task/stack-canarymultitask默认实现ax-task/multitask已强制启用它,不存在真实“不启用 task 栈 canary 的 multitask”配置ax-task/fifo/ax-std/fifo/ 旧sched-fifoax-task在未选择rr/cfs时天然使用 FIFO;单独 feature 只表达默认值,没有裁剪或选择意义sched-rr/sched-cfs旧命名rr/cfs,避免在ax-task命名空间内重复sched-前缀ax-std/dynldext-ld的真实含义是 external linker,不是 dynamic loader;不引入误导性新名字aic8800-wifi旧命名aic8800;设备型号已足够表达真实驱动目标starry-kernel/sg2002-wifistarry-kernel/sg2002和ax-runtime/aic8800,源码无独立 cfg 站点;板级配置应显式组合两个真实能力dummy-if-not-enabled旧命名stubs,直接表达生成 stub API 的行为ext4fs/fatfs旧命名ext4/fat命名保留 Feature 必要性复核
下表按唯一能力名复核。若同一名字出现在
ax-runtime、ax-std、ax-libc或 API 暴露层中,上层 feature 只作为直接映射入口保留,不代表底层能力被重复定义。每条给出移除条件,供后续维护者判断 feature 生命周期。smpirqipiirq的必选子集。smp隐含包含,无独立裁剪需求。wake-ipiax-ipi队列时使用。ipi的轻量模式被合并进ipifeature 自身(如ipi = ["wake-ipi-mode"])。fp-simd、xuantie-c9xx、hvrtcpagingtlsuspacemultitaskpreemptax-task局部能力。抢占计数、抢占调度和 kernel guard 行为可独立于基础 multitask 审计。multitask,不再有"协作式 multitask"配置。rr、cfsstack-guard-pagestack-protectorlockdeptask-ext、tracepoint-hooksallocax-api/ax-posix-api/ax-std仍支持无 alloc 的更小 API 表面。global-allocatorax-alloc局部/std-compat支撑能力;不是普通应用 feature。std-compat间接启用,无独立裁剪需求。tlsf、buddy-slabtrackingfsvfsax-fs-ng高层 VFS/cache/open-options/context API 是否编译。ext4、fatnetvsocknet默认实现。dnsax-std网络行为开关。只控制ToSocketAddrs是否进行 DNS 查询,应依赖net。net默认行为。display、inputusb、virtio-*、aic8800dmadma,因为 runtime 没有独立 DMA 装配代码,DMA 在 runtime 侧只需paging支撑。paging暴露。axklibruntime 适配层ax-runtime默认提供axklib::Klib适配实现;没有paging/irq时相关内存映射和 IRQ 操作返回Unsupported。动态平台基础路径会使用axklib::mmio,因此该适配层不能挂在paging、fs或net等可选 feature 后面。fd、pipe、select、poll、epollfs/net通过fd组合。stubsax-api。用于生成未启用 API 的 stub 符号,不是 runtime 能力。std-compatext-ldax-runtime/build.rs生成可扩展链接脚本runtime.x而非最终linker.x,Axvisor/StarryOS/LKM 实际依赖该模式追加自定义 section。linker.x被废弃。backtrace、dwarfcopyax-mm局部能力。只在需要复制页表映射时启用ax-page-table-multiarch/copy-from。paging默认行为。ArceOS 底层模块层
ax-halsmp,irq,ipi,fp-simd,xuantie-c9xx,rtc,paging,tls,uspace,hvhost-test只作为测试内部 feature,不进入用户能力层;删除无真实消费路径的axvisor-linkerax-taskmultitask,irq,ipi,preempt,smp,stack-guard-page,lockdep,task-ext,tls,tracepoint-hooks,uspace,rr,cfsstack-canary独立 feature;删除sched-fifo,FIFO 为默认调度器;host-test/test只作为测试内部 featureax-syncmultitask,lockdepax-allocglobal-allocator,tlsf,buddy-slab,trackingax-mmcopyax-fs-ngvfs,ext4,fat,lockdepstd和times;时间戳行为默认编译ax-netvsock等真实网络栈变体ax-displayax-inputaxbacktracealloc,dwarfax-runtimeax-runtime只保留会改变 runtime 初始化或全局系统装配的 feature。irqipiirq、dep:ax-ipi、ax-hal/ipi、ax-task?/ipiwiringwake-ipismpuspacepagingmultitasktlsfsax-fs-ng/vfs、page cache、block IRQ / task opsext4fs+ax-fs-ng/ext4fatfs+ax-fs-ng/fatnetirq+multitask+paging+ 网络设备和网络栈注册vsocknet+ vsock 设备 / 协议支持displaypaging+ display 设备注册inputpaging+ input 设备注册rtcaic8800std-compatext-ldruntime.x而非最终linker.x,供外层镜像追加 sectionlockdepfs启用时传播到ax-fs-ng/lockdepstack-guard-pageax-feat/stack-guard-page的ipi/multitask/paging前置条件stack-protectorax-runtime默认依赖axklib并提供axklib::Klib适配实现。这不是用户可选择的能力,而是动态平台和驱动基础路径需要的 runtime 适配层;未启用paging或irq时,相关mem_iomap/ IRQ 操作应返回Unsupported,而不是让链接符号缺失。ax-runtime/fs本身表示“文件系统 runtime 栈存在”,不表示具体磁盘格式。当前仓库确实有ext4和fat两种文件系统格式,因此具体 rootfs 格式应通过ext4/fat选择。构建可启动 rootfs 时,不应只启用fs而不启用任何格式 feature。API 与用户库层
ax-apiirq,ipi,alloc,paging,dma,multitask,fs,net,display,stubsax-posix-apismp,irq,alloc,multitask,lockdep,fd,fs,net,pipe,select,poll,epollsmp/lockdep影响 build.rs 生成的 C 头文件和 pthread mutex ABI;该层只控制 POSIX API / C ABI 表面ax-stdstd-compat,ext-ld,smp,fp-simd,uspace,hv,irq,ipi,wake-ipi,alloc,paging,dma,tls,multitask,lockdep,task-ext,tracepoint-hooks,rr,cfs,stack-guard-page,stack-protector,fs,ext4,fat,net,vsock,aic8800,dns,fd,display,input,usb,rtc,backtrace,dwarf,virtio-*fs打开文件 API 和基础 runtime fs 栈,但不选择具体 rootfs 格式,格式用ext4/fat;xuantie-c9xx这类具体 CPU errata/扩展由平台或系统集成者直接启用ax-hal/xuantie-c9xx,不放入通用应用接口层ax-libcsmp,fp-simd,irq,alloc,paging,tls,multitask,lockdep,stack-protector,fs,ext4,fat,net,fd,pipe,select,poll,epollax-posix-api暴露 API,通过ax-runtime装配系统能力目标归属模型
1. 模块局部 Feature
每个底层 crate 只拥有本 crate 的局部能力。
ax-halsmp,irq,ipi,fp-simd,xuantie-c9xx,rtc,paging,tls,uspace,hvax-taskmultitask,irq,ipi,preempt,smp,stack-guard-page,task-ext,tls,tracepoint-hooks,uspace,rr,cfs,lockdepax-syncmultitask,lockdepax-mmcopyax-runtimeax-driverax-fs-ngvfs,fat,ext4,lockdep等文件系统实现 / API featureax-netvsock等网络栈 featureax-displayax-inputaxbacktracealloc,dwarf规则:crate 不应暴露只用于命名其他层产物概念的 feature。
2. Runtime 装配 Feature
ax-runtime拥有系统装配图。只要启用某项能力需要启动期初始化、全局 runtime 状态、设备探测、IRQ 注册、DMA 设置或调度器参与,对应依赖就应放在ax-runtime。目标
ax-runtimefeature 职责:irqipiwake-ipismpuspaceax-hal/uspace和ax-task?/uspacepagingmultitasktlsfsext4fatnetirq、multitask、paging前置条件vsockdisplayax-feat/display的paging前置条件inputax-feat/input的paging前置条件rtcaic8800std-compatext-ldruntime.x而非最终linker.x,供外层镜像追加 sectionlockdepfs启用时传播到ax-fs-ng/lockdepstack-guard-pageipi、multitask、paging前置条件stack-protector规则:
ax-runtime可以依赖更底层模块。更底层模块不能依赖 user library 或 API 暴露层 crate。3. API 暴露层 Feature
ax-api和ax-posix-api只描述哪些公开 API 被编译。它们可以启用类型检查和 API 实现所需的直接依赖,但不能再通过全局 feature 聚合层转发。ax-api目标 feature:irqax-task?/irq;只保持 API 行为和WaitQueue::wait_timeout*编译所需 task IRQ 能力,不启用ax-runtime/irqipidep:ax-ipiallocdep:ax-allocpagingdep:ax-mmdmadep:ax-dmamultitaskax-task/multitask,ax-sync/multitaskfsdep:ax-fs-ngnetdep:ax-netdisplaydep:ax-displaystubsdummy-if-not-enabled,用于在真实 API feature 未启用时生成 stub 符号ax-posix-api目标 feature:smppthread_mutex_t内存布局时区分 SMP 与非 SMP,并作为 bindgen 的AX_CONFIG_SMP输入irqsys_sched_yield()在无 multitask 时等待 IRQ 还是自旋allocdep:ax-allocmultitaskalloc,ax-task/multitask,ax-sync/multitasklockdepmultitask,ax-sync/lockdep,ax-kspin/lockdep;同时被 build.rs 用于pthread_mutex_tlayout 计算,保证 C ABI 与 Rust 锁布局一致fdalloc,dep:scope-localfsdep:ax-fs-ng,fdnetdep:ax-net,fdpipefdselectfdpollfdepollfd规则:API 暴露层的 feature 名可以和 runtime feature 名相同,但 API 暴露层不负责启用 runtime 装配。
4. 用户库 Feature
ax-std和ax-libc成为唯一的 ArceOS 用户库接口层。ax-stdfeature 策略:ax-std/*。ax-std显式组合以下内容:ax-api/*控制 API 可见性。ax-posix-api/*控制 POSIX 兼容接口。ax-runtime/*控制 runtime 装配。ax-std自身直接使用底层符号时,才直接启用底层模块 feature。ax-std已承诺的默认应用驱动选择,才保留在ax-std中。目标
ax-std映射:std-compatax-alloc/global-allocator,ax-runtime/std-compatsmpax-runtime/smp,ax-kspin/smp,ax-posix-api/smpfp-simdax-hal/fp-simduspaceax-runtime/uspacehvax-hal/hvirqax-api/irq,ax-posix-api/irq,ax-runtime/irqipiax-api/ipi,ax-runtime/ipiwake-ipiax-runtime/wake-ipiext-ldax-runtime/ext-ldallocax-api/alloc,ax-io/alloc,ax-posix-api/alloc;ax-alloc仍作为普通依赖存在,不写dep:ax-alloc,除非后续将该依赖 optional 化pagingalloc,ax-runtime/pagingdmaax-api/dma,ax-runtime/pagingtlsax-runtime/tlsmultitaskax-api/multitask,ax-posix-api/multitask,ax-runtime/multitasklockdepmultitask,ax-posix-api/lockdep,ax-runtime/lockdeptask-extax-task/task-exttracepoint-hooksax-task/tracepoint-hooksrrirq,multitask,ax-task/rrcfsirq,multitask,ax-task/cfsstack-guard-pageax-runtime/stack-guard-pagestack-protectorax-runtime/stack-protectorfsax-api/fs,ax-posix-api/fs,ax-runtime/fs,ax-driver/virtio-blk,fdext4fs,ax-runtime/ext4fatfs,ax-runtime/fatnetax-api/net,ax-posix-api/net,ax-runtime/net,ax-driver/virtio-net,fdvsockax-runtime/vsockaic8800ax-runtime/aic8800dnsnet;仅改变ToSocketAddrs是否调用 DNS 查询,不单独启用新的底层模块fdax-posix-api/fd,ax-posix-api/polldisplayax-api/display,ax-runtime/displayinputax-runtime/inputusbirq,ax-driver/usbrtcax-runtime/rtcbacktraceaxbacktrace/allocdwarfaxbacktrace/dwarfvirtio-blkax-driver/virtio-blkvirtio-netax-driver/virtio-netvirtio-gpuax-driver/virtio-gpuvirtio-inputax-driver/virtio-inputvirtio-socketax-driver/virtio-socketax-libcfeature 策略:ax-libc/*。ax-libc直接组合 POSIX API 和 runtime 装配。ax-libc不能依赖ax-std。目标
ax-libc映射:smpax-runtime/smp,ax-kspin/smp,ax-posix-api/smpfp-simdax-hal/fp-simdirqax-posix-api/irq,ax-runtime/irqallocax-posix-api/alloctlsalloc,ax-runtime/tlsmultitaskax-posix-api/multitask,ax-runtime/multitasklockdepax-posix-api/lockdep,ax-runtime/lockdepstack-protectorax-runtime/stack-protectorfsax-posix-api/fs,ax-runtime/fs,fdext4fs,ax-runtime/ext4fatfs,ax-runtime/fatnetax-posix-api/net,ax-runtime/net,fdfdax-posix-api/fdpipeax-posix-api/pipeselectax-posix-api/selectpollax-posix-api/pollepollax-posix-api/epoll规则:
ax-std和ax-libc应保持显式,但不要重复展开ax-runtime已经负责的下层细节。它们的 feature 表应让组合关系清晰可审计。5. 上层系统 Feature
StarryOS 和 Axvisor 不能再依赖
ax-feat。StarryOS 目标策略:
starry-kernel直接启用所需 ArceOS 基础模块:ax-hal/*ax-runtime/*ax-task/*ax-sync/*ax-driver/*ax-fs-ng/*ax-net/*axbacktrace/*starry-kernel如果直接使用ax_sync::Mutex等 sleepable / task-aware 同步原语,应在自身依赖上启用ax-sync/multitask,不能依赖starryos镜像包或其他上层组合隐式打开。starry-kernel/sg2002-wifi聚合 feature;licheerv-nano-sg2002-wifi.toml直接组合starry-kernel/sg2002和ax-runtime/aic8800。starryos镜像包主要启用starry-kernel/*、平台和具体驱动。Axvisor 目标策略:
ax-std/*。ax-hal/hvax-runtime/*ax-task/*ax-driver/*规则:上层系统应表现为系统集成者,而不是应用 crate。
实施方案
实施按 4 个变更组推进,每组有明确的验证门槛。变更组之间有依赖:A → B → C → D。
变更组 A:消除
ax-feat聚合层范围:删除
ax-featcrate,将所有ax-feat/*引用按上文映射表原地展开到各层 Cargo.toml。编辑文件:
Cargo.toml:删除 workspace dependencies 中的ax-feat条目。os/arceos/api/arceos_api/Cargo.toml、os/arceos/api/arceos_posix_api/Cargo.toml:删除ax-feat.workspace = true,按 API 暴露层映射表展开 feature。os/arceos/ulib/axstd/Cargo.toml、os/arceos/ulib/axstd/src/lib.rs:删除ax-feat.workspace = true,按用户库接口层映射表展开。os/arceos/ulib/axlibc/Cargo.toml:同上,新增ax-runtime和ax-kspinworkspace 依赖。ax-feat条目。os/arceos/api/axfeat/整个目录。API 暴露层清理细节:
ax-api/stack-guard-page(ax-api/src无对应 API 符号)。ax-api/dummy-if-not-enabled重命名为stubs。ax-runtime/*(除非直接调用 runtime 符号)。验证:
变更组 B:收敛底层模块和
ax-runtimeFeature范围:在
ax-task、ax-fs-ng、ax-runtime中执行 feature 重命名、删除、默认化。ax-task改动:sched-fifo(FIFO 是multitask默认调度器)。sched-rr→rr,sched-cfs→cfs(去 crate 命名空间冗余)。stack-canary独立 feature,stack canary 成为multitask默认实现细节。ax-fs-ng改动:std(空 feature)。timesfeature,#[cfg(feature = "times")]改为默认编译。无 wall time provider 时保留返回 0 的运行时回退。ax-runtime改动:dma = ["paging"](runtime 无独立 DMA 装配路径)。fs中的"dma"替换为"paging"。fs中的"ax-fs-ng/vfs"(控制高层 VFS/cache/open-options/context API)。lockdep = ["ax-fs-ng?/lockdep"](lockdep + fs时传播到文件系统层)。uspace = ["ax-hal/uspace", "ax-task?/uspace"](承接 task 层页表切换 API)。stack-guard-page = ["ipi", "multitask", "paging", "ax-task?/stack-guard-page"](承接 IPI TLB shootdown 路径)。net改为自包含系统装配 feature,含irq、multitask、paging。display、input补paging前置条件。ipi = ["irq", "dep:ax-ipi", "ax-hal/ipi", "ax-task?/ipi"]。aic8800-wifi重命名为aic8800,同步ax-driver/aic8800-wifi→ax-driver/aic8800。ext-ld(控制build.rs输出runtime.xvslinker.x),不引入dynld误导名。axklib并提供axklib::Klib适配实现;未启用paging/irq时对应操作返回Unsupported。rr/cfs在ax-std的组合行为(有意改进,非等价替换):ax-std/rr = ["irq", "multitask", "ax-task/rr"]ax-std/cfs = ["irq", "multitask", "ax-task/cfs"]ax-feat/sched-*只打开ax-task调度算法 feature,可能缺少 runtime scheduler 初始化。清理后启用ax-std/rr或ax-std/cfs应得到完整可运行的 multitask runtime 栈。FIFO 不需要独立 feature,启用multitask且不选择rr/cfs即为 FIFO。验证:
变更组 C:上层系统迁移
范围:StarryOS / Axvisor / LKM / axbuild / test-suit 中所有
ax-feat/*替换为直接 feature。StarryOS(编辑
os/StarryOS/kernel/Cargo.toml、os/StarryOS/starryos/Cargo.toml、os/StarryOS/lkm/*/Cargo.toml及相关文档/构建配置):starry-kernel直接依赖消费的 ArceOS 模块(ax-hal/*、ax-runtime/*、ax-task/*、ax-sync/*等)。starry-kernel如果直接使用ax_sync::Mutex等 sleepable/task-aware 同步原语,应在自身依赖上启用ax-sync/multitask,禁止依赖上层组合隐式传播。starryos镜像包不启用底层 ArceOS feature,除非有镜像级集成职责。Axvisor(编辑
os/axvisor/Cargo.toml、virtualization/*/Cargo.toml):ax-std/*构建时使用新 feature 名。ax-hal/hv、ax-runtime/*等)。axbuild(编辑
scripts/axbuild/相关文件):AxFeaturePrefixFamily::AxFeat分支。normalize_legacy_feature_alias()中axfeat处理。is_removed_dynamic_platform_feature()中ax-feat/plat-dyn分支。feature_family_from_existing_features()对ax-feat/的检测。StdFeaturePrefixFamily::AxStd单变体(仍有AxStd消费者),不删除整个 enum。ext4fs/fatfs不再作为可传播旧名,构建配置必须使用ext4/fat。ax-feat/{unknown},直接映射到模块/runtime feature 或拒绝。替换示例(StarryOS):
ax-feat/irqax-runtime/irqax-feat/smpax-runtime/smp+ax-kspin/smp+ax-posix-api/smp;内部 crate:直接启用消费的 SMP 模块 featureax-feat/sched-rrax-runtime/irq,ax-runtime/multitask,ax-task/rrax-feat/sched-fifoax-runtime/multitask且不选rr/cfs即 FIFOax-feat/ext4fsax-runtime/ext4ax-feat/aic8800-wifiax-runtime/aic8800ax-feat/fs-timesax-feat/ext-ldax-runtime/ext-ld;若通过ax-std用户库接口层,用ax-std/ext-ld验证:
cargo xtask starry build --arch riscv64 cargo xtask starry build --arch aarch64 cargo xtask axvisor build --arch aarch64 cargo test -p axbuild变更组 D:文档与工具链
范围:清理所有把
ax-feat描述为架构层的文档和生成产物。编辑文件:
docs/docs/architecture/arceos.md、docs/docs/components/crates/ax-feat.md、docs/docs/components/crates/{ax-api,ax-posix-api,ax-std,ax-runtime,starry-kernel,starryos}.md、docs/docs/build/arceos/build.md、os/arceos/doc/build.md等。必要改动:
docs/docs/components/crates/ax-feat.md。ax-feat。ax-api/ax-posix-api)、用户库接口层(ax-std/ax-libc)、runtime 装配(ax-runtime)、底层模块。ax-feat/*改为ax-std/*/ax-libc/*/ax-runtime/*或直接模块 feature。最终搜索验证:
允许的匹配:历史 CHANGELOG 条目、本方案文件(直至归档)。除此之外必须全部删除或改写。
清理后的依赖规则
硬性规则:
os/arceos/api/*不能依赖已删除的 feature 聚合 crate。ax-runtime不能依赖ax-api、ax-posix-api、ax-std或ax-libc。ax-api和ax-posix-api不能启用ax-runtime/*,除非它们直接调用 runtime 符号。ax-std可以依赖ax-api、ax-posix-api、ax-runtime和更底层模块。ax-libc可以依赖ax-posix-api、ax-runtime和更底层模块。Cargo.toml依赖ax-*crate 时,如不希望被默认 feature 影响,应显式写default-features = false,然后只开启本镜像实际需要的 feature。期望依赖方向:
验证与合并门槛
定向验证命令
格式化:
定向 clippy(每个 crate 必须通过):
axbuild 单元测试(
cargo xtask test不支持--package过滤,使用原生 Cargo):cargo test -p axbuild代表性镜像构建:
合并门槛 Checklist
ax-feat已从根 workspace dependencies 移除。os/arceos/api/axfeat/目录已删除。ax-feat、axfeat、AxFeat或ax_feat。axbuild中不再存在AxFeat前缀族分支。ax-feat/*。ax-stdfeature 定义显式且可读。ax-libcfeature 定义显式且可读。ax-api和ax-posix-api不承担 runtime 装配职责。ax-runtime拥有系统装配依赖。ax-feat描述为 ArceOS 层级。最终架构
入口规则
清理完成后,feature 模型的认知负担应最小化:
ax-std/*。ax-libc/*。ax-api/*。ax-posix-api/*。ax-runtime/*。架构不变量
以下不变量必须长期维持,任何破坏它们的变更都应在 PR 中显式说明:
cfg站点、dep:启用、build.rs 消费,或作为ax-std/ax-libc的公开用户库能力入口出现在映射表中;禁止仅为缩短配置而新增聚合别名。ax-runtime是唯一的系统装配层:API 暴露层不拥有 runtime 装配职责;ax-std/ax-libc可以显式组合ax-runtime/*,但不重复展开 runtime 已负责的底层细节;底层模块不反向依赖上层。ax-api/fs和ax-runtime/fs是独立 feature,仅名字相同,关系只能通过Cargo.toml显式声明传递。axklib适配层无条件编译:不作为用户可选 feature,因为动态平台基础路径(axklib::mmio)无条件依赖它。ax-std、ax-libc不重复展开ax-hal/ax-task/ax-driver细节,除非自身直接使用对应符号。ax-*依赖显式写default-features = false:避免被未来可能引入的非空 default feature 隐式影响。不再存在单独的顶层 feature crate。Cargo feature 图本身是唯一事实来源。