Skip to content

feat(starry): add jcode app case for x86_64 QEMU#977

Closed
jakeuibn wants to merge 2 commits into
rcore-os:devfrom
os-biglab:dev-2
Closed

feat(starry): add jcode app case for x86_64 QEMU#977
jakeuibn wants to merge 2 commits into
rcore-os:devfrom
os-biglab:dev-2

Conversation

@jakeuibn

Copy link
Copy Markdown
Contributor

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.

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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。主要两处:

  1. 下载 URL 使用 latest/download/ 缺少版本固定和 SHA256 校验(与 codex-cli 的已建立模式不一致)
  2. README 引用了尚不存在的文件路径

其他观察(非阻塞)

  • glibc stub 汇编中 mallopt: mov $1, %eax; ret 总是返回 1,glibc 的 mallopt 确实返回非零表示成功,因此正确
  • __register_atfork stub 返回 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() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

缺少版本固定和完整性校验。

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 哈希。

建议:

  1. JCODE_URL 改为固定版本的 tag URL,例如 https://github.com/1jehuang/jcode/releases/download/vX.Y.Z/jcode-linux-x86_64.tar.gz
  2. 新增 jcode_sha256 变量,下载后通过 sha256sum 校验
  3. 同样对 Alpine minirootfs 添加校验

这样可保证构建可复现,也能检测下载损坏或供应链篡改。

jcode 在 StarryOS 上运行需要以下内核修复(已合入主分支):

- ext4 文件系统块分配和 JBD2 superblock 修复
- EPOLLET edge-triggered epoll 竞态修复

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

引用了不存在的文件路径。

  • test-suit/starryos/normal/qemu-smp1/jcode/ 在本 PR 和 dev 分支均不存在。如果这是未来计划的 CI 测试,建议改为说明性语言,例如「计划在 test-suit/starryos/normal/qemu-smp1/jcode/ 添加 CI 测试用例」,而非暗示它已经存在。
  • report/kernel_changes_report.md 在仓库中任何位置都不存在。请删除此引用,或将报告文件加入本 PR。

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.shprepare_*_assets.shprepare_*_rootfs.sh),glibc stub 汇编实现技术正确,QEMU smoke 测试配置合理。

变更内容

  • 7 个文件,571 行新增,全部为 shell 脚本、TOML 配置和 Markdown 文档
  • 无 Rust 代码变更
  • build-x86_64-unknown-none.tomlcodex-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。核心问题:

  1. 缺少版本固定和完整性校验JCODE_URL 使用 latest/download/,与 codex-cli 建立的「固定版本号 + SHA256 校验」模式不一致。同样缺少 Alpine minirootfs 的 SHA256 校验。
  2. Alpine URL 版本不一致ALPINE_VERSION="3.21" 但 URL 文件名硬编码 3.21.3,两者未联动。
  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"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

缺少版本固定和完整性校验,与 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
}

建议:

  1. JCODE_URL 改为固定版本的 tag URL,例如 https://github.com/1jehuang/jcode/releases/download/vX.Y.Z/jcode-linux-x86_64.tar.gz
  2. 新增 jcode_sha256 变量,下载后通过 sha256sum 校验
  3. 同样对 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"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alpine 版本变量与 URL 中的版本不一致。

ALPINE_VERSION="3.21" 但 URL 文件名硬编码了 3.21.3。如果将来更新 ALPINE_VERSION3.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
```

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

引用了不存在的路径。

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。

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

引用了不存在的文件。

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.
@jakeuibn jakeuibn closed this May 27, 2026

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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:40Zmerged: false)。本次 review 基于当前 HEAD 99589e04f 进行。

变更内容

  • 9 个文件,+592/-3,全部为 shell 脚本、TOML 配置、Cargo 版本更新和 Markdown 文档
  • 无 Rust 代码变更
  • 新增 apps/starry/jcode/ 目录:prebuild.shprepare_jcode_assets.shprepare_jcode_rootfs.shqemu-x86_64.tomlbuild-x86_64-unknown-none.tomlREADME.md
  • Cargo.toml/Cargo.lock 将 ostool 从 0.19 升级到 0.21(dev 分支已有此版本,变更无冲突影响)

与早期 review 的关系

本 PR 已有两轮 bot review(commit 6db69cc76),提出了版本固定、SHA256 校验和 README 路径问题。当前 HEAD 99589e04f 已修复这些阻塞问题:

  1. 版本固定JCODE_VERSION="0.12.0",URL 使用 v${JCODE_VERSION} 而非 latest/download/
  2. SHA256 校验JCODE_SHA256ALPINE_MINIROOTFS_SHA256 均已添加,verify_sha256() 函数完整
  3. Alpine 版本统一ALPINE_PATCH="3.21.3" 独立变量,URL 路径和文件名一致
  4. 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.tomlcodex-cli 完全一致
  • qemu-x86_64.toml 配置合理:success_regexfail_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' \

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

技术观察(非阻塞):

__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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant