2026 年 4 月开发月报
2026 年 4 月是 TGOSKits 工作区快速发展的一月。全月共产生 457 次非合并提交、102 次合并 PR,涉及 31 位贡献者。本月在工作区层面完成了一次大规模的 crate 统一命名重构,在 StarryOS 层面大量修复了 Linux 兼容性系统调用的行为,在 Axvisor 层面新增了 FreeRTOS/Zephyr 客户机支持和龙芯架构 CI,在构建和测试基础设施上也做了大量改进。
总览
| 指标 | 数据 |
|---|---|
| 非合并提交数 | 457 |
| 合并 PR 数 | 102 |
| 贡献者人数 | 31 |
| 涉及 PR 编号范围 | #49 ~ #414 |
贡献者排行
| 贡献者 | 提交数 | 主要方向 |
|---|---|---|
| 周睿 (ZR233) | 215 | 构建系统、crate 重命名、CI、工作区治理 |
| ZCShou | 55 | Axvisor/QEMU 集成、调试基础设施、文档 |
| chyyuu | 42 | crate 统一命名重构 |
| Codex Verify | 30 | 自动化版本管理与依赖更新 |
| Joseph Joshua Anggita | 19 | StarryOS 系统调用修复与特性实现 |
| Tempest (seek-hope) | 10 | StarryOS 测试与 bug 修复 |
| CharlieV | 10 | 文件系统修复、测试基础设施 |
| szy | 9 | 板级支持、驱动迁移、快速启动 |
| Shi Lei | 8 | 同步原语、锁依赖检测、调度器 |
| YanLien | 7 | RK3588 驱动、VM 重定位 |
| Josen-B | 7 | FreeRTOS/Zephyr 客户机支持 |
| 朝倉水希 | 5 | 工具链升级、BSS 修复、linkme 替换 |
| Ivans | 5 | Axvisor 测试与 vCPU 修复 |
| Ticonderoga2017 | 3 | findutils/grep 测试用例 |
| leeehh | 3 | stat 系统调用加固、mmap/madvise 修复 |
| 其他 16 位贡献者 | 若干 | 各类修复与改进 |
一、仓库设施
构建系统 (axbuild)
4 月的 axbuild 经历了多轮重构,核心目标是让 QEMU 仿真测试和物理板卡测试都能通过 cargo xtask 一键完成。我们实现了完整的 QEMU 测试编排流程,将 Axvisor 和 Starry 的测试路径统一到同一个编排框架下;随后为 Starry QEMU 测试添加了分组执行能力,使得测试可以按 normal/stress 等类别分别运行;远程物理板卡测试方面,为 OrangePi-5-Plus 建立了从构建、部署、串口等待到结果判定的完整流水线。
- PR #394 — QEMU 测试编排与 Axvisor/Starry 测试重构(ZCShou)
- PR #369 — Starry QEMU 测试分组执行(周睿)
- PR #234 — Starry QEMU 测试流程重构(周睿)
- PR #199 — OrangePi-5-Plus 远程板卡测试(周睿)
- PR #189 — 板卡配置助手(周睿)
- PR #291 — 目标构建配置增强(周睿)
在代码质量方面,我们贡献了 sync-lint 工具的两阶段实现,可以自动检查代码中 atomic::Ordering 的使用是否正确,帮助防止隐秘的并发 bug。同时还添加了支持全量、指定包和增量模式的 clippy 检查机制,让 CI 能够按变更范围执行静态检查。
- PR #274 — sync-lint 原子序检查第一阶段(Shi Lei)
- PR #322 — sync-lint 混合序检查扩展(Shi Lei)
- 选择性 clippy(全量、指定包和增量模式)(周睿)
Rootfs 处理也经历了模块化重构。我们将共享的 rootfs 辅助函数提取到公共模块,并将根文件系统从原有格式迁移到 Alpine 以减小镜像体积。同时修复了 ld 在准备 staging rootfs 时解析到错误库的问题。
- PR #340 — rootfs 辅助函数提取(ZCShou)
- PR #399 — rootfs 处理模块化(ZCShou)
- PR #297、PR #380 — Alpine 根文件系统迁移(ZCShou)
- PR #413 — ld 库解析修复(flying-mice987)
- PR #414 — 预构建脚本重构与 QEMU 发现增强(ZCShou)
CI/CD 与工具链
我们重组了 CI 流水线,清理了阻塞 clippy 的历史问题;随后将可复用工作流统一,并将常用工具预装到 CI 容器中,减少了单次任务的安装开销。4 月 28 日还进行了一次大规模的工作区元数据继承清理(50+ 次提交),让所有子 crate 通过 workspace.package 继承统一的版本号、许可证和仓库地址。
- PR #178 — CI 重组与 clippy 阻塞修复(周睿)
- PR #236 — 可复用工作流统一与容器工具预装(周睿)
- PR #195 — dev-dependencies 裸金属目标限制(周睿)
- 工作区元数据继承(50+ 次提交)(周睿)
工具链方面,我们主导了两次 Rust 工具链升级,并将 linkme 库替换为 EII,修复了 BSS 段问题,清理了 StarryOS 中过时的代码。
- PR #148 — 工具链升级至 2026-04-01(朝倉水希)
- PR #352 — 工具链升级至 2026-04-27(朝倉水希)
- PR #151 — linkme 替换为 EII(朝倉水希)
- PR #171 — BSS 段修复(朝倉水希)
- PR #353 — StarryOS 过时代码清理(朝倉水希)
文档与调试体验
我们添加了全面的 VS Code 调试文档和配置,包括 ArceOS、Axvisor、StarryOS 的 launch 配置和 QEMU 调试脚本,降低了新贡献者的上手门槛。同时贡献了 StarryOS 快速启动指南。
- PR #272 — VS Code 调试文档与配置(ZCShou)
- PR #406 — 文档链接更新(ZCShou)
- PR #183 — StarryOS 快速启动指南(szy)
- PR #389 — 中断驱动控制台文档(周睿)
- PR #388 — 跨内核驱动技能文档(周睿)
测试基础设施
测试能力上,我们建立了 C/Rust 用户态测试基础设施,使得可以在 StarryOS 上直接编译和运行测试程序。同时添加了 Python 测试流水线和 busybox 测试用例,支持通过 sh 脚本注入来验证系统行为。
- PR #235 — C/Rust 用户态测试基础设施(Zhihang Shao)
- PR #355 — Python 测试流水线(CharlieV)
- PR #299 — busybox 测试用例(wyatt-dai)
- PR #76 — GitHub Codespace devcontainer(Zhihang Shao)
- PR #391 — review-open-prs 技能(周睿)
二、ArceOS
Crate 统一命名重构
4 月初最重大的工程是将整个工作区中所有 crate 的名称统一到 ax-* 前缀规范下,在 4 月 7-8 日集中完成。此次重命名覆盖了 ArceOS 所有核心模块,涉及数百个文件中的引用更新:
- 内核基础设施:
axhal→ax-hal、axtask→ax-task、axmm→ax-mm、axsync→ax-sync、axdma→ax-dma - 驱动与设备:
axdriver→ax-driver、axnet→ax-net、axnet-ng→ax-net-ng、axinput→ax-input、axdisplay→ax-display - 文件系统:
axfs→ax-fs、axfs-ng→ax-fs-ng - 运行时与配置:
axruntime→ax-runtime、axconfig→ax-config、axplat→ax-plat - 标准库与 POSIX:
axstd→ax-std、axlibc→ax-libc、arceos_api→ax-api、arceos_posix_api→ax-posix-api - 示例应用:
arceos-helloworld→ax-helloworld、arceos-httpserver→ax-httpserver等
调度器与同步
我们在调度器和同步原语方面做出了多项改进:将调度器回退到旧机制并优化了 mutex handoff 逻辑,在 axtask 中强制执行 might_sleep 检查以防止在原子上下文中误调用睡眠操作。同时修复了中断 waker 注册时序——必须在标志交换之前完成注册,否则可能丢失唤醒事件,以及 RISC-V 平台上 IPI 唤醒丢失的问题。
- PR #56 — 调度器回退并优化 mutex handoff(Shi Lei)
- PR #152 — might_sleep 执行与回归修复(Shi Lei)
- PR #316 — 中断 waker 注册时序修复(Joseph Joshua Anggita)
- PR #222 — IPI 唤醒丢失修复(Shi Lei)
平台与运行时
平台支持方面,我们为 ArceOS 添加了 RISC-V 64 QEMU Virt 平台支持,实现了中断驱动的控制台输入替代原有的轮询方式,降低了空转时的 CPU 开销。VirtIO 设备支持也得到了加强:升级了 virtio-drivers 并添加了 PCI 块设备和 VirtIO-net-pci 支持。同时修复了 aarch64 plat-dyn 的 Huge PTE 检测和早期 FP/SIMD 初始化问题,统一了分配器后端并添加了 per-CPU buddy slab 支持。
- PR #293 — RISC-V 64 QEMU Virt 平台支持(ZCShou)
- PR #343 — 中断驱动控制台输入(周睿)
- PR #287 — IRQ、RTC 和 TTY 事件支持(周睿)
- PR #169 — VirtIO PCI 块设备升级(周睿)
- PR #176 — VirtIO-net-pci 支持(周睿)
- PR #184 — VirtIO 网络队列与缓冲区管理(ZCShou)
- PR #168 — Huge PTE 检测和早期 FP/SIMD 初始化(szy)
- PR #154 — 一次性定时器首触发修复(szy)
- PR #149 — PCI BAR 探测失败传播(Sasuke0723)
- PR #161 — per-CPU buddy slab 统一分配器(周睿)
三、StarryOS
4 月是 StarryOS 系统调用兼容性突飞猛进的一个月。多位贡献者在信号、进程凭证、内存管理、文件系统、网络 IPC、epoll 等领域贡献了大量修复,并新增了丰富的综合测试用例。
信号与进程
我们在信号处理方面做出了系统性改进:实现了 SA_RESTART 系统调用重启语义——当慢速系统调用被信号中断时内核会自动重启该调用;实现了 PR_SET_PDEATHSIG/PR_GET_PDEATHSIG,子进程可以在父进程死亡时收到指定信号。同时修复了 sigaltstack 的 MINSIGSTKSZ 检查和整体信号处理中的一系列问题。
- PR #247 — SA_RESTART 系统调用重启语义(Joseph Joshua Anggita)
- PR #249 — PR_SET_PDEATHSIG / PR_GET_PDEATHSIG(Joseph Joshua Anggita)
- PR #207 — sigaltstack MINSIGSTKSZ 检查(Joseph Joshua Anggita)
- PR #49 — 信号处理整体修复(Shi Lei)
进程管理方面最重要的改动是实现了每进程凭证子系统,引入了完整的 uid/gid/euid/egid/suid/sgid 管理框架和权限检查逻辑,使得文件访问权限判断、信号发送权限验证等有了正确的基础。相关修复还包括 sched affinity、prlimit64、clone3 等。
- PR #246 — 每进程凭证子系统(Joseph Joshua Anggita)
- PR #276 — sched affinity pid 参数修复(Shuo Zhang)
- PR #267 — proc status CPU 亲和性(Shuo Zhang)
- PR #269 — clone3 读取长度限制(Feiran Qin)
- PR #319 — prlimit64 允许提升硬限制(Joseph Joshua Anggita)
- PR #208 — getgroups size=0 查询修复(Joseph Joshua Anggita)
内存管理
我们将 mmap/munmap/mprotect 的错误返回值逐一与 Linux 行为对齐,确保返回正确的 errno。为 madvise 添加了 advice 参数验证、对齐检查和映射存在性判断。同时修复了 mremap 未正确保留映射共享类型的问题,以及 pause() 行为和 NULL 指针验证。
- PR #285 — mmap/munmap/mprotect 对齐 Linux(leeehh)
- PR #278 — madvise 参数验证(leeehh)
- PR #263 — mremap 保留映射共享类型(Tempest)
- PR #296 — pause() 和 NULL 指针验证(CharlieV)
文件系统
文件系统修复集中在 VFS 行为和 ext4 稳定性两方面。我们修复了 tmpfs 硬链接返回空数据的关键 bug——原因是硬链接创建时未传播页缓存。目录操作方面,修复了 mkdir("/") 返回值、目录 fd 的 read/write errno、打开目录时的 O_WRONLY 拒绝等问题。同时修复了 rename 时源 DirEntry 被提前释放的问题。
- PR #378 — tmpfs 硬链接页缓存传播(CharlieV)
- PR #348 — tmpfs 硬链接回归测试(韩佳辛)
- PR #375 — mkdir("/") 返回 EINVAL(CharlieV)
- PR #264 — 目录 fd read/write 返回 EISDIR(Tempest)
- PR #324 — 目录 fd write errno 修正(CharlieV)
- PR #253 — O_WRONLY/O_RDWR 对目录返回 EISDIR(CharlieV)
- PR #312 — rename 保留源 DirEntry(Joseph Joshua Anggita)
- PR #303 — lseek 负偏移返回 EINVAL(CharlieV)
- PR #251 — fsync/fdatasync 目录 fd 处理(Joseph Joshua Anggita)
- PR #265 — unlinkat 无效标志位拒绝(Jiaxin2006)
ext4 存储稳定性也有重要进展。我们修复了 rsext4 的 JBD2 日志回放问题,使得 Linux rootfs 在异常关机后可以被正确恢复;为数据块缓存添加了增长上限。同时从 x-kernel 同步了 ext4/rsext4 的崩溃一致性修复,并为 StarryOS 添加了 GPT 分区表扫描和根分区自动选择能力。
- PR #398 — rsext4 JBD2 日志回放修复(周睿)
- PR #408 — rsext4 数据块缓存增长限制(周睿)
- PR #284 — rsext4/ext4 崩溃一致性同步(Debin)
- PR #179 — GPT 分区扫描与根分区自动选择(szy)
网络/IPC 与 epoll
共享内存管理器在 SMP 场景下存在 AB/BA 死锁问题,我们通过调整锁获取顺序彻底修复。unix socket 方面修复了 bind 后 chown 行为和对端关闭后 recv 返回 EOF 的问题。eventfd 的读写语义也得到了修正。
- PR #226 — SHM AB/BA 死锁修复(Joseph Joshua Anggita)
- PR #261 — sys_shmat 错误处理(Tempest)
- PR #313 — unix socket bind 后 chown(Joseph Joshua Anggita)
- PR #311 — unix stream recv EOF(Joseph Joshua Anggita)
- PR #370 — eventfd 读写语义修复(manchangfengxu)
epoll 方面修复了 EPOLL_CTL_MOD 后未重新排队就绪事件的问题、epoll_pwait 的 sigsetsize 与 musl 的兼容性,以及 F_GETFL 返回不正确的访问模式标志。
- PR #314 — EPOLL_CTL_MOD 后重新排队(Joseph Joshua Anggita)
- PR #250 — epoll_pwait sigsetsize 兼容 musl(Joseph Joshua Anggita)
- PR #260 — F_GETFL 返回正确访问模式标志(Tempest)
其他系统调用
4 月还修复了大量零散的系统调用行为偏差。我们为 preadv2/pwritev2 添加了 offset=-1 支持(表示使用当前文件偏移)并拒绝了不支持的 flags;修复了 ftruncate、copy_file_range、getrandom 等参数验证;修复了 futex 等待时用户态内存访问的安全问题;对 stat/fstatat/statx 进行了全面加固。
- PR #326 — preadv2/pwritev2 offset=-1 支持(CharlieV)
- PR #258 — pwrite64 负偏移验证(Tempest)
- PR #280 — pwritev2 修复(Zitao Chen)
- PR #381 — pwrite64 fd 验证(manchangfengxu)
- PR #209 — ftruncate 负长度拒绝(Joseph Joshua Anggita)
- PR #211 — copy_file_range 验证(Joseph Joshua Anggita)
- PR #210 — getrandom 标志验证(Joseph Joshua Anggita)
- PR #256 — pipe fd errno 修正(CharlieV)
- PR #305 — close_all_fds 实现(Debin)
- PR #257 — times() 进程 CPU 时间修复(Zitao Chen)
- PR #302 — futex 用户态内存访问修复(周睿)
- PR #259 — exit_robust_list futex 处理(Tempest)
- PR #255 — ioctl FIONBIO 修复(杨凯森)
- PR #300 — stat/fstatat/statx 加固(leeehh)
- PR #262 — TIOCSPGRP pgid 读取修复(Tempest)
- PR #402 — console UART 写入保持原始模式(周睿)
