feat(starry): add jcode app case for x86_64 QEMU#977
Conversation
There was a problem hiding this comment.
Review: feat(starry): add jcode app case for x86_64 QEMU
概述
本 PR 在 apps/starry/jcode/ 下新增了 jcode (AI coding agent) 的操作者面向工作流,包含:
- glibc-to-musl 二进制补丁流程(patchelf + qemu-user + glibc stub .so)
- rootfs 注入脚本
- QEMU smoke 测试配置
- README 文档
实现质量整体较高,脚本有 set -euo pipefail、cleanup trap 和 need_cmd 检查,glibc stub 的汇编实现技术正确。但有两处需要修改后再合并。
变更内容
- 仅 shell 脚本、TOML 配置和 Markdown 文档,无 Rust 代码变更
- 正确放置在
apps/starry/jcode/,遵循codex-cli/deepseek-tui等已有 app case 模式 build-x86_64-unknown-none.toml与 codex-cli 完全一致
本地验证
- Bash 语法检查:3 个脚本均通过
bash -n - 无 Rust 代码变更,无需 cargo fmt/clippy/test
- 已对比
apps/starry/codex-cli/结构,build-x86_64-unknown-none.toml完全一致
CI 状态
- 所有 CI check 均为
skipped(fork PR,非 PR 导致的失败)
重复/重叠分析
- 搜索
repo:rcore-os/tgoskits type:pr jcode:唯一 open 的 jcode PR 即本 PR #977 - 同作者之前有多个已合并的 jcode 相关内核修复 PR(#675 rsext4、#677/#698 ARP、#681/#696/#910 EPOLLET),均已合入 dev,与本 PR 无冲突
- base 分支无
apps/starry/jcode/目录,不存在重复
需要修改的问题
见下方 inline comments。主要两处:
- 下载 URL 使用
latest/download/缺少版本固定和 SHA256 校验(与 codex-cli 的已建立模式不一致) - README 引用了尚不存在的文件路径
其他观察(非阻塞)
- glibc stub 汇编中
mallopt: mov $1, %eax; ret总是返回 1,glibc 的 mallopt 确实返回非零表示成功,因此正确 __register_atforkstub 返回 0(成功),符合预期JCODE_NO_AUTO_UPDATE=1的自动更新防护措施是必要的,避免覆盖已打补丁的二进制
Powered by glm-5.1
| ALPINE_MINIROOTFS_URL="https://dl-cdn.alpinelinux.org/alpine/v${ALPINE_VERSION}/releases/x86_64/alpine-minirootfs-3.21.3-x86_64.tar.gz" | ||
| JCODE_URL="https://github.com/1jehuang/jcode/releases/latest/download/jcode-linux-x86_64.tar.gz" | ||
|
|
||
| cleanup() { |
There was a problem hiding this comment.
缺少版本固定和完整性校验。
JCODE_URL 使用 latest/download/,这意味着每次构建可能下载不同版本的 jcode 二进制,构建不可复现。
对比 apps/starry/codex-cli/prebuild.sh 的模式:
package="@openai/codex@0.115.0-linux-x64"
codex_sha256="440269f35afeb90d38115af844629d98705fb7266fdcd5fe7c040a78ebc75b85"codex-cli 同时固定了版本号和 SHA256 哈希。
建议:
- 将
JCODE_URL改为固定版本的 tag URL,例如https://github.com/1jehuang/jcode/releases/download/vX.Y.Z/jcode-linux-x86_64.tar.gz - 新增
jcode_sha256变量,下载后通过sha256sum校验 - 同样对 Alpine minirootfs 添加校验
这样可保证构建可复现,也能检测下载损坏或供应链篡改。
| jcode 在 StarryOS 上运行需要以下内核修复(已合入主分支): | ||
|
|
||
| - ext4 文件系统块分配和 JBD2 superblock 修复 | ||
| - EPOLLET edge-triggered epoll 竞态修复 |
There was a problem hiding this comment.
引用了不存在的文件路径。
test-suit/starryos/normal/qemu-smp1/jcode/在本 PR 和 dev 分支均不存在。如果这是未来计划的 CI 测试,建议改为说明性语言,例如「计划在test-suit/starryos/normal/qemu-smp1/jcode/添加 CI 测试用例」,而非暗示它已经存在。report/kernel_changes_report.md在仓库中任何位置都不存在。请删除此引用,或将报告文件加入本 PR。
There was a problem hiding this comment.
Review: feat(starry): add jcode app case for x86_64 QEMU
概述
本 PR 在 apps/starry/jcode/ 下新增了 jcode(AI coding agent)的 x86_64 QEMU 操作者工作流。整体结构与 codex-cli app case 保持一致(prebuild.sh → prepare_*_assets.sh → prepare_*_rootfs.sh),glibc stub 汇编实现技术正确,QEMU smoke 测试配置合理。
变更内容
- 7 个文件,571 行新增,全部为 shell 脚本、TOML 配置和 Markdown 文档
- 无 Rust 代码变更
build-x86_64-unknown-none.toml与codex-cli完全一致
本地验证
- ✅
bash -n语法检查:3 个 shell 脚本均通过 - ✅ 无 Rust 代码变更,无需 cargo fmt/clippy/test
- ✅
build-x86_64-unknown-none.toml与 codex-cli 完全一致 - ✅
prebuild.sh正确支持STARRY_WORKSPACE环境变量
重复/重叠分析
- 唯一 open 的 jcode PR 即本 PR #977
- base 分支无
apps/starry/jcode/目录,不存在重复 - 同作者之前有已合入的 jcode 相关内核修复 PR(#675、#677、#681 等),与本 PR 无冲突
需要修改的问题
有 4 处需要修改,见下方 inline comments。核心问题:
- 缺少版本固定和完整性校验:
JCODE_URL使用latest/download/,与codex-cli建立的「固定版本号 + SHA256 校验」模式不一致。同样缺少 Alpine minirootfs 的 SHA256 校验。 - Alpine URL 版本不一致:
ALPINE_VERSION="3.21"但 URL 文件名硬编码3.21.3,两者未联动。 - README 引用了不存在的文件路径:
test-suit/starryos/normal/qemu-smp1/jcode/和report/kernel_changes_report.md均不存在。
Powered by glm-5.1
Powered by mimo-v2.5-pro
|
|
||
| ALPINE_VERSION="3.21" | ||
| ALPINE_MINIROOTFS_URL="https://dl-cdn.alpinelinux.org/alpine/v${ALPINE_VERSION}/releases/x86_64/alpine-minirootfs-3.21.3-x86_64.tar.gz" | ||
| JCODE_URL="https://github.com/1jehuang/jcode/releases/latest/download/jcode-linux-x86_64.tar.gz" |
There was a problem hiding this comment.
缺少版本固定和完整性校验,与 codex-cli 的已建立模式不一致。
JCODE_URL 使用 latest/download/,这意味着每次构建可能下载不同版本的 jcode 二进制,构建不可复现。
对比 apps/starry/codex-cli/prepare_codex_assets.sh 的模式:
package="@openai/codex@0.115.0-linux-x64"
codex_sha256="440269f35afeb90d38115af844629d98705fb7266fdcd5fe7c040a78ebc75b85"
verify_sha256() {
local expected="$1" local path="$2"
local actual=$(sha256sum "$path" | awk '{print $1}')
[[ "$actual" != "$expected" ]] && exit 1
}建议:
- 将
JCODE_URL改为固定版本的 tag URL,例如https://github.com/1jehuang/jcode/releases/download/vX.Y.Z/jcode-linux-x86_64.tar.gz - 新增
jcode_sha256变量,下载后通过sha256sum校验 - 同样对 Alpine minirootfs 添加校验(
alpine_sha256)
这样可保证构建可复现,也能检测下载损坏或供应链篡改。
| cache_dir="$workspace/target/jcode/cache" | ||
|
|
||
| ALPINE_VERSION="3.21" | ||
| ALPINE_MINIROOTFS_URL="https://dl-cdn.alpinelinux.org/alpine/v${ALPINE_VERSION}/releases/x86_64/alpine-minirootfs-3.21.3-x86_64.tar.gz" |
There was a problem hiding this comment.
Alpine 版本变量与 URL 中的版本不一致。
ALPINE_VERSION="3.21" 但 URL 文件名硬编码了 3.21.3。如果将来更新 ALPINE_VERSION 为 3.22,URL 路径会变为 v3.22/releases/ 但文件名仍为 alpine-minirootfs-3.21.3-x86_64.tar.gz,导致 404。
建议将 patch 版本也参数化:
ALPINE_VERSION="3.21"
ALPINE_PATCH="3"
ALPINE_MINIROOTFS_URL="https://dl-cdn.alpinelinux.org/alpine/v${ALPINE_VERSION}/releases/x86_64/alpine-minirootfs-${ALPINE_VERSION}.${ALPINE_PATCH}-x86_64.tar.gz"或统一为单个完整版本变量:ALPINE_MINIROOTFS_VERSION="3.21.3"。
| # 运行 jcode TUI | ||
| jcode | ||
| ``` | ||
|
|
There was a problem hiding this comment.
引用了不存在的路径。
test-suit/starryos/normal/qemu-smp1/jcode/ 在本 PR 和 dev 分支均不存在。如果这是未来计划的 CI 测试,建议改为说明性语言:「计划在 test-suit/starryos/normal/qemu-smp1/jcode/ 添加 CI 测试用例」,而非暗示它已经存在。
|
|
||
| ## 边界 | ||
|
|
||
| 这个 example 只声明 x86_64 QEMU 下的手动演示流程。它不覆盖 jcode TUI 在线模式、CI 测试、或其他架构上的 jcode。 |
There was a problem hiding this comment.
引用了不存在的文件。
report/kernel_changes_report.md 在仓库中不存在。请删除此引用,或将报告文件加入本 PR。
Add an operator-facing jcode (AI coding agent) workflow under apps/starry/jcode/. The two-stage pipeline downloads jcode from GitHub releases, patches the glibc binary for musl via patchelf + qemu-user, builds a glibc stub .so, and injects everything into a dedicated rootfs image. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
ostool 0.21.0 includes the mouse event forwarding fix for TUI applications (jcode, ratatui-based tools) running on the QEMU serial console. The host terminal now correctly forwards scroll/click/drag events to the guest kernel, and Moved events are filtered to prevent UART saturation and TUI redraw storms.
There was a problem hiding this comment.
Review: feat(starry): add jcode app case for x86_64 QEMU
概述
本 PR 在 apps/starry/jcode/ 下新增 jcode(AI coding agent)的 x86_64 QEMU 操作者工作流。当前 PR 状态为 已关闭未合并(closed_at: 2026-05-27T09:50:40Z,merged: false)。本次 review 基于当前 HEAD 99589e04f 进行。
变更内容
- 9 个文件,+592/-3,全部为 shell 脚本、TOML 配置、Cargo 版本更新和 Markdown 文档
- 无 Rust 代码变更
- 新增
apps/starry/jcode/目录:prebuild.sh、prepare_jcode_assets.sh、prepare_jcode_rootfs.sh、qemu-x86_64.toml、build-x86_64-unknown-none.toml、README.md Cargo.toml/Cargo.lock将 ostool 从 0.19 升级到 0.21(dev 分支已有此版本,变更无冲突影响)
与早期 review 的关系
本 PR 已有两轮 bot review(commit 6db69cc76),提出了版本固定、SHA256 校验和 README 路径问题。当前 HEAD 99589e04f 已修复这些阻塞问题:
- ✅ 版本固定:
JCODE_VERSION="0.12.0",URL 使用v${JCODE_VERSION}而非latest/download/ - ✅ SHA256 校验:
JCODE_SHA256和ALPINE_MINIROOTFS_SHA256均已添加,verify_sha256()函数完整 - ✅ Alpine 版本统一:
ALPINE_PATCH="3.21.3"独立变量,URL 路径和文件名一致 - ✅ README 路径修正:
test-suit/starryos/normal/qemu-smp1/jcode/改为「计划在...添加」,report/kernel_changes_report.md引用已删除
本地验证
- ✅
bash -n语法检查:3 个 shell 脚本均通过 - ✅ 无 Rust 代码变更,无需 cargo fmt/clippy/test
- ✅
build-x86_64-unknown-none.toml与codex-cli完全一致 - ✅
qemu-x86_64.toml配置合理:success_regex和fail_regex覆盖正常输出和常见崩溃模式
CI 状态
PR 来自 fork(os-biglab/tgoskits),CI check 状态为 skipped,非 PR 代码导致。
重复/重叠分析
- ✅
apps/starry/jcode/在 dev 分支不存在,全部为新增内容 - ✅ 搜索 open PR 未发现 jcode 相关 PR
- ✅ 同作者之前已合入的内核修复 PR(#675 ext4、#677/#698 ARP、#681/#696/#910 EPOLLET)与本 PR 无冲突
- ✅ 当前 open PR(#989 cgroup2、#990 ftruncate)与本 PR 完全无关
技术观察(非阻塞)
glibc stub 汇编中的 __printf_chk、__fprintf_chk、__vfprintf_chk wrapper 未完整处理 flag 参数提升:
__printf_chk(flag, fmt, ...)的%rdi含 flag,wrapper 直接mov %rsi, %rdi丢弃 flag 但%rdx未移到%rsi- 作为 musl stub 这是可接受的(musl printf 会忽略多余的
%rdx),但不完全符合 chk 语义
结论
当前 HEAD 已修复早期 review 的所有阻塞问题。实现结构与 codex-cli 模式一致,glibc-to-musl 补丁流程技术正确。PR 当前处于关闭状态,如需合并需作者重新打开并解决与 dev 的合并冲突。
Powered by mimo-v2.5-pro
| 'res_init: xor %eax, %eax; ret' \ | ||
| '' \ | ||
| '.globl __register_atfork' \ | ||
| '.type __register_atfork, @function' \ |
There was a problem hiding this comment.
技术观察(非阻塞):
__printf_chk wrapper 的参数提升不完整。
当前实现:mov %rsi, %rdi; mov %rdx, %rsi; jmp printf@PLT
对于 __printf_chk(int flag, const char *fmt, ...):
- %rdi = flag(被覆盖)
- %rsi = fmt → 移到 %rdi ✓
- %rdx = 第一个 variadic arg → 移到 %rsi(但 printf 的第一个 variadic arg 在 %rdx)
结果:第一个 variadic 参数被 printf 误读为 fmt 字符串。如果 jcode 调用 __printf_chk 带格式参数,会导致崩溃或乱码。
建议改为不调整寄存器(直接跳转,让 musl printf 忽略多余的 %rdx),或完整重排所有参数位置。同样的问题存在于 __fprintf_chk 和 __vfprintf_chk。
Add an operator-facing jcode (AI coding agent) workflow under apps/starry/jcode/. The two-stage pipeline downloads jcode from GitHub releases, patches the glibc binary for musl via patchelf + qemu-user, builds a glibc stub .so, and injects everything into a dedicated rootfs image.