feat(starry-kernel): add x86_64 ptrace gdb support - #1307
Conversation
|
debug register / user area: PTRACE_PEEKUSER / PTRACE_POKEUSER / GETFPXREGS: |
There was a problem hiding this comment.
审核结果:APPROVE ✅
变更概述
本 PR 为 StarryOS 补齐 x86_64 架构的 ptrace/GDB 支持,使 riscv64/aarch64/loongarch64/x86_64 四个架构在 test-ptrace-gdb 覆盖范围内达到一致的支持水平。核心变更:
- 新增
X8664UserRegs(27 个寄存器,布局匹配 Linuxuser_regs_struct)和X8664FpRegs(透明包装FxsaveArea)。 - x86_64 single-step 使用
EFLAGS.TF,通过ExceptionKind::Debug产生SIGTRAPstop,符合标准 x86 机制。 sanitize_ptrace_x86_64_eflags正确限制用户可写标志位(CF/PF/AF/ZF/SF/TF/DF/OF/RF/AC/ID),并强制保留位1。FxsaveArea添加Clone, Copyderive,支持 FP 状态的 ptrace 复制。- 将
write_to签名统一为返回AxResult<()>,x86_64 可返回EINVAL(CS/SS 变更时),其他架构始终返回Ok(()),向后兼容。 - 移除了
ptrace_getsiginfo/ptrace_setsiginfo/ptrace_read_user_siginfo/ptrace_siginfo_signo上不必要的#[cfg]门限,是合理的清理。 - 测试代码覆盖:x86_64 寄存器布局、FP/XMM 验证、single-step 落点、SETREGSET PC 修改、legacy regset、clone/vfork 事件。vfork 测试使用 raw syscall 避免共享 C 调用栈问题。
CI 状态
Cancel stale CI runs、Detect changed paths: successCheck formatting / run_host、Run sync-lint / run_container: 仍在进行中(非失败)- 测试 QEMU jobs: 均为 skipped(预期行为——PR 仅修改内核 ptrace 代码,不触发 QEMU 测试路径过滤器)
- 未发现 CI 失败
本地验证
cargo fmt --check: 通过 ✅cargo clippy --manifest-path components/axcpu/Cargo.toml --all-features -- -D warnings: 通过 ✅cargo xtask clippy --package starry-kernel(17 个 feature 组合): 全部通过 ✅
关联 PR
基线已有 #931(初始 GDB)、#1167(改进可用性)、#1247(aarch64/loongarch64)、#1292(多架构改进),均已合并。本 PR 是自然的架构扩展,无重叠或冲突。
设计评价
orig_rax从uctx.rax映射(而非独立字段):pragmatic choice,trap frame 可能没有独立 orig_rax。ds/es/fs/gs硬编码为 0:StarryOS x86_64 不使用分段,cs/ss 写保护防止修改关键段寄存器。- 整体设计与现有三架构 ptrace 模型完全一致,未引入不必要的 x86-only debug register 兼容层。
潜在风险(非阻塞)
- CI 中 formatting/sync-lint 尚未完成,但本地验证已通过,预计不会有问题。
test-ptrace-gdb的 x86_64 路径在 CI 中未通过 QEMU 运行验证(路径过滤器未触发),但这与其他架构的 PR 策略一致。
Powered by mimo-v2.5-pro
背景
此前 StarryOS 的用户态 GDB 初步支持已经覆盖 riscv64、aarch64 和 loongarch64。本 PR 在现有 ptrace/GDB 设计基础上补齐 x86_64 支持,使四个主要架构在
test-ptrace-gdb覆盖范围内保持一致的支持力度。修改内容
ArchUserRegs/ArchFpRegs映射。PTRACE_GETREGS/PTRACE_SETREGS。PTRACE_GETREGSET/PTRACE_SETREGSET的NT_PRSTATUS和NT_FPREGSET。PTRACE_GETFPREGS/PTRACE_SETFPREGS,与 regset 语义复用。FxsaveArea保存和恢复 tracee 的 FP/SIMD 状态。EFLAGS.TF实现 single-step。ExceptionKind::Debug,清除 TF 并产生 ptraceSIGTRAPstop。ptrace_setup_singlestep签名统一为和其他架构一致的形式,便于维护四架构共同路径。test-ptrace-gdbtest-ptrace-gdb启用到 x86_64。设计说明
本 PR 沿用现有 riscv64/aarch64/loongarch64 的 ptrace/GDB 支持模型:
PTRACE_PEEKUSER/PTRACE_POKEUSER/GETFPXREGS等额外 Linux 兼容接口。ArchUserRegs/ArchFpRegs抽象,保持四架构路径一致。验证
已在 Docker 长期容器中验证:
docker exec tgoskits-dev cargo xtask clippy --package starry-kernel