Skip to content

feat(starry-kernel): add x86_64 ptrace gdb support - #1307

Closed
Promin3 wants to merge 1 commit into
rcore-os:devfrom
Promin3:feat/starryos-gdb-x86
Closed

feat(starry-kernel): add x86_64 ptrace gdb support#1307
Promin3 wants to merge 1 commit into
rcore-os:devfrom
Promin3:feat/starryos-gdb-x86

Conversation

@Promin3

@Promin3 Promin3 commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

背景

此前 StarryOS 的用户态 GDB 初步支持已经覆盖 riscv64、aarch64 和 loongarch64。本 PR 在现有 ptrace/GDB 设计基础上补齐 x86_64 支持,使四个主要架构在 test-ptrace-gdb 覆盖范围内保持一致的支持力度。

修改内容

  1. 补充 x86_64 用户寄存器与 FP regset 支持
  • 增加 x86_64 ArchUserRegs / ArchFpRegs 映射。
  • 支持 PTRACE_GETREGS / PTRACE_SETREGS
  • 支持 PTRACE_GETREGSET / PTRACE_SETREGSETNT_PRSTATUSNT_FPREGSET
  • 支持 legacy PTRACE_GETFPREGS / PTRACE_SETFPREGS,与 regset 语义复用。
  • 使用 x86_64 FxsaveArea 保存和恢复 tracee 的 FP/SIMD 状态。
  1. 补充 x86_64 single-step 支持
  • x86_64 使用 EFLAGS.TF 实现 single-step。
  • 在用户态返回路径中处理 ExceptionKind::Debug,清除 TF 并产生 ptrace SIGTRAP stop。
  • 将 x86_64 的 ptrace_setup_singlestep 签名统一为和其他架构一致的形式,便于维护四架构共同路径。
  1. 扩展 test-ptrace-gdb
  • test-ptrace-gdb 启用到 x86_64。
  • 增加 x86_64 用户寄存器布局、FP/XMM 验证、single-step 落点、SETREGSET PC 修改、legacy regset、clone/vfork 事件验证。
  • x86_64 vfork 测试使用 raw syscall,避免 vfork child 回到共享 C 调用栈造成非 ptrace 语义相关的干扰。

设计说明

本 PR 沿用现有 riscv64/aarch64/loongarch64 的 ptrace/GDB 支持模型:

  • 不引入额外的 x86-only debug register / user area 兼容层。
  • 不实现 PTRACE_PEEKUSER / PTRACE_POKEUSER / GETFPXREGS 等额外 Linux 兼容接口。
  • 将 x86_64 纳入现有 ArchUserRegs / ArchFpRegs 抽象,保持四架构路径一致。
  • 当前目标仍是 StarryOS 可用子集的用户态 GDB 支持,而不是完整 Linux ptrace 语义。

验证

已在 Docker 长期容器中验证:

docker exec tgoskits-dev cargo xtask clippy --package starry-kernel

@Promin3

Promin3 commented Jun 18, 2026

Copy link
Copy Markdown
Contributor Author

debug register / user area:
这是 x86 Linux 历史接口的一部分,GDB 可以通过 user area 读写部分寄存器、调试寄存器 DR0-DR7、段寄存器等。要正确支持它,要定义完整 user area ABI、debug register 安全检查、硬件断点/观察点语义、权限过滤,以及和当前 ptrace stop 模型的同步关系。做不好很容易引入假的“能读写”,但实际硬件断点不可靠。

PTRACE_PEEKUSER / PTRACE_POKEUSER / GETFPXREGS:
这些也是 legacy Linux ptrace 兼容接口。现代 GDB 的基础调试路径主要依赖 GETREGSET/SETREGSET、NT_PRSTATUS、NT_FPREGSET,我们现在四架构都围绕这套 regset 语义实现。GETFPXREGS 在 x86 上和 FXSAVE/扩展 FP 状态有关,但如果再单独实现一套,会和现有 NT_FPREGSET 形成重复入口,需要保证布局、长度、写回时机完全一致。

@Promin3 Promin3 closed this Jun 18, 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.

审核结果:APPROVE ✅

变更概述

本 PR 为 StarryOS 补齐 x86_64 架构的 ptrace/GDB 支持,使 riscv64/aarch64/loongarch64/x86_64 四个架构在 test-ptrace-gdb 覆盖范围内达到一致的支持水平。核心变更:

  • 新增 X8664UserRegs(27 个寄存器,布局匹配 Linux user_regs_struct)和 X8664FpRegs(透明包装 FxsaveArea)。
  • x86_64 single-step 使用 EFLAGS.TF,通过 ExceptionKind::Debug 产生 SIGTRAP stop,符合标准 x86 机制。
  • sanitize_ptrace_x86_64_eflags 正确限制用户可写标志位(CF/PF/AF/ZF/SF/TF/DF/OF/RF/AC/ID),并强制保留位1。
  • FxsaveArea 添加 Clone, Copy derive,支持 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 runsDetect changed paths: success
  • Check formatting / run_hostRun 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_raxuctx.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

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