实习期自 2026-07 起。期间与 Agent 集群协作提交 88 个 PR,合入 36 个;其余多为计算与渲染用例,不验证内核语义,按收录范围撤下。本页只讲实习开始后提交的工作,分三段:用真实应用补/测内核,把浏览器跑起来并对照 Linux 提速,把系统调用拆成可替换的包。末尾是对全部内核补丁的溯源。
其中,主要分为三个主要的阶段:
7月:以各项 Linux App 地毯式覆盖测试为导向的对 StarryOS 的测试与修复。
8月:以火狐浏览器 CPU/GPU 两侧可在 StarryOS 上正确运行渲染与交互以及提升性能为导向的对 StarryOS 的测试与修复。
9月:主要为 win mac linux 三种 系统能力的支持 的解耦与实现,以及之前补丁的溯源任务。
本篇总结报告主要属于总结汇报相关成果,详细的周报以及相关内容请移步:wiki。对于方法论概要,请参考:对照 Linux 评估 StarryOS 子系统与浏览器启动,对于 Win/Mac 等系统的相关认知笔记请参考:三种 ABI 的系统调用与加载器。
应用测试与子系统补全
把Linux app装进镜像跑,跑不通就对照 Linux 源码补内核,补完留回归用例。
应用:dropbear、dnsmasq、监控栈、科学计算与机器学习(SciPy、Numba、scikit-learn)、多媒体与流媒体栈、单核并发,以及 StarryWRT(OpenWrt 用户态,#1580)。
| 负载 | 补上的内核功能 |
|---|---|
| 监控栈 | /proc/vmstat(#1525) |
| Envoy | /proc/pid/comm 的填充;非阻塞 TCP 部分发送(#1558) |
| dnsmasq | IP_MTU_DISCOVER、UDP 关闭前冲刷(#1568);SIOCGIFNAME(#1707) |
| 浏览器依赖的系统调用 | 一批系统调用按 Linux 的语义补齐(#1569);同步故障信号优先投递(#1700) |
| 每次关机 | 卸载根文件系统必然失败,改为尽力而为(#1711) |
新实现:POSIX 消息队列及一致性套件(#1564、#1565)、TUN/TAP(#1566、#1567)。
对照 Linux 源码改正:times、select、arch_prctl(#2263、#2260、#2259);setns 与 id 映射的特权只认初始 user namespace(#2266)。
浏览器启动与优化
NetSurf 四架构出图 → Firefox 经 Weston 显示 → 经 HTTPS 打开 4399 → 软件渲染与 virgl 两路(#2323)→ 与 Linux 6.12 对照。
对照只换内核:同一套 QEMU、同一份根盘、同一个二进制。证据三层:Firefox 端到端、18 个环节的压力基准、内核栈采样。
| 对照用例 | 问题 | 修复 | 修复前 | 修复后 | Linux |
|---|---|---|---|---|---|
| 回环 TCP 往返 | 每次发 IPI 都重建 APIC 句柄 | #2432 | 415.7 µs | 129.9 µs | 34.3 µs |
| epoll 等待(1020 个 fd) | 每次等待都把所有 fd 重新注册一遍 | #2302、#2433 | 499.9 µs | 37.0 µs | 0.56 µs |
| fork(64 MiB) | 逐页查重是平方级 | #2577 | 84.5 ms | 14.0 ms | 0.17 ms |
| open 加 close(持有 512 个 fd) | close 扫全系统 fd 表 | #2576 | 19.8 µs | 3.2 µs | 2.3 µs |
| mmap 加 munmap(1024 个映射) | 每次操作展开整棵 VMA 树 | #2302、#2578 | 277.1 µs | 96.8 µs | 4.4 µs |
| 内核栈采样 | 分配对象时遍历整条 full slab 链表 | #2301 | 512 次分配遍历 2701 个节点 | 0 个 | – |
nc 发 CONNECT |
TCP 半关闭后,状态变了却没通知出去 | #2575 | 16 秒后失败 | 0 秒 | 0 秒 |
| Firefox 冷启动 12 次 | netlink 回复没补到 4 的倍数,读的一方越界 | #2574 | 段错误 5 次 | 0 次 | 0 次 |
| 远程桌面里起 xterm | 打开 tty 不设控制终端等五处 | #2426 | 起不来 | 正常 | 正常 |
| 鼠标放久了不跟手 | epoll 套 epoll 时,唤醒被已失效的等待项拿走 | dev 已换实现,补用例 #2378 | 不跟手 | 正常 | 正常 |
| 事件循环单核空转 | unix stream 两端共用一个等待队列 | #2194 | 21 过 3 挂 | 24 项全部通过 | 24 项全部通过 |
| Firefox 启动到导航 | 以上各项之和 | 全部合到一处 | 59.2 秒 | 42.4 秒 | 22.5 秒 |
已追平:空系统调用、管道、stat、unix socket、写文件。未追平(10.04 在最新 dev 上重测):解除映射 84 倍、epoll 等待 78 倍、fork 67 倍、mmap 64 倍、信号投递 30 倍、缺页 8.7 倍;页面资源只取到 Linux 的一半。
系统调用包抽象线
设计见 #2202。硬件与应用不变,操作系统只是用不同规范组织同一批能力。把系统调用从内核拆出来做成包,每套规范是一个系统调用参考实现,内核只留能力端口与分发。
| 包 | 作用 |
|---|---|
ax-dispatch |
注册参考实现,按进程所属的 ABI 分发陷入 |
ax-binfmt |
识别并加载 ELF、PE、Mach-O |
ax-abi-port |
能力端口:文件、内存、进程、信号、时钟等,内核只实现一遍 |
ax-abi-linux、ax-abi-windows、ax-abi-darwin |
三套参考实现 |
ax-abi |
分发包:按 feature 选哪几套进链接,给出默认分发策略 |
内核侧三处改动:进程控制块加 abi_slot,加载镜像时记下所属 ABI,陷入时按它直接取实现;加载器不再解析 ELF,读文件头后交给认领它的包;一个适配器让端口直接使用内核已有的 fd 表、地址空间、线程与时钟上。
| 参考实现 | 验证用的二进制 | CPython 3.14 套件(23 个模块) |
|---|---|---|
| Linux | Alpine 的 CPython 3.14.7 | 23 个全部通过 |
| Windows | python.org 的 Windows 版 | 19 个通过 |
| Darwin | python.org 的 macOS 版 CPython 3.14.7 | 交互解释器可用,platform.platform() 得 Darwin-20.6.0-x86_64-64bit,扩展模块在导入时加载 |
代码在 fork 的 feat-personality-win(Linux 与 Windows)与 feat-personality-mac(Darwin);设计与跑法见 docs/design/syscall-abi-packages.md。
代码溯源
对全部 68 个内核补丁逐个溯源,已全部完成;其中 24 个是实习期间提交的。每个补丁一份文件,写明问题与原因、改动与影响范围、Linux 源码的具体行、man 原文与验证结果,这部分属于是一开始没有考虑周到,如果一开始的工作流就协调输出这些溯源对照文件,那么也就不需要直到最后才统一处理专门花费时间做此项工作。
| 项 | 数量 |
|---|---|
| 溯源文件 | 68 |
| Linux 源码链接,固定到同一提交的具体行 | 746 |
| man 手册引文,与 6.19 版原文逐字相同 | 207 |
| 记了问题的文件 | 51 |
引用由脚本逐条核对,零错误。发现分四类:
| 类别 | 例 |
|---|---|
| 补丁的行为与 Linux 仍有出入 | #720:路径末尾带斜杠加 O_CREAT,Linux 返回 EISDIR,补丁返回 ENOENT 或 ENOTDIR |
| 正文与合入的 diff 不符 | #1164:正文写越界得 SIGBUS,合入时是 SIGSEGV |
| 回归用例拦不住回归 | #1124:按修复前的代码推演,用例在修复前也会通过 |
| 改动已被后续提交取代 | #2302 的 epoll 部分被 #2456 取代 |
之后
- 个人:闭关消化现有知识存量。
- 项目:完成深度学习库的测试;继续修缮系统调用的抽象包。
相关链接
- wiki 原页:总结报告,周报见 wiki 首页
- 系统调用参考实现:
feat-personality-win、feat-personality-mac - 总结 PPT:Lfan-ke/tgoskits 的 ppt 分支
- 演示视频:Lfan-ke/hw4os-s5d1t2 的 video 分支
- 75 份溯源文件:README