Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

周报(2026-02-22 至 2026-02-28)

开发分支


总结

本周核心进展:将 guest-kprobe 的 BrkInject 路径从"能进入流程但不稳定"推进到"可重复验证"——命令解析补齐、keepalive 基线建立、detach 竞态处理完成,形成了可执行的 attach → fire → detach 全流程。


一、已完成工作

1. 命令入口补齐:--inject / --ret

此前 trace kprobe vm<id>:<addr> ... --inject 被 shell 直接拒绝,原因是命令树只有 usage 文本而未注册对应 flag。本周补齐该缺口,命令可正常进入 manager 路径并走后续注册/回滚逻辑(commit: 4f3f5d1,文件:kernel/src/shell/commands/trace.rs)。

2. VMM 侧地址翻译 hook 注册

新增 register_guest_kprobe_hooks() 统一注册 VMM 侧的 4 组地址翻译回调(commit: 4f3f5d1,文件:kernel/src/vmm/mod.rs):

  • register_guest_pt_read_hook:读取 guest 页表项
  • register_vm_ttbr1_hook:获取 VM 的 TTBR1_EL1
  • register_gpa_to_hpa_hook:GPA→HPA 转换
  • register_stage2_exec_hook:Stage-2 执行权限切换

3. BrkInject 端到端机制实现(axebpf)

在 axebpf 侧完成 BrkInject 核心实现(commit: 452e641),涉及 11 个文件、+959/-34 行:

  • 地址翻译src/probe/kprobe/addr_translate.rs):GVA→GPA→HPA 三级地址翻译,通过 hook 回调解耦 VMM 依赖
  • BRK 注入与恢复src/probe/kprobe/manager.rs):原指令备份、BRK #4 写入、detach 时原指令还原
  • stale-BRK 恢复策略src/probe/kprobe/handler.rs):处理 detach 竞态下残留 BRK 的安全恢复
  • 新增测试(4 个测试文件):覆盖地址翻译、handler、manager、context 四个维度

4. 建立 keepalive 验证基线

新增 scripts/ostool/prepare_arceos_mini_shell_guest.sh 准备 guest 镜像,支持 mini-shellkeepalive 模式。keepalive 模式解决了"guest 很快退出导致验证窗口消失"的问题,主机侧 shell 能在 VM 运行期间保持可交互。

5. BrkInject 端到端验证通过

qemu-aarch64-shell + keepalive guest 场景下验证:

trace kprobe vm1:0xffff800000002878 printk --inject

验证结果:

  • attach 成功,trace list 中 HITS 持续增长
  • trace stream --filter kprobe -n 5 可观测到事件
  • detach 后探针可清理且 VM 保持 Running
  • 连续多轮快速 attach/detach 压测未再复现 EC_60/Brk64 panic

6. 文档与集成说明更新(axebpf)

更新 README(commit: 2383fa5),补充 guest-kprobe 集成指南与验证步骤。


二、遇到的问题与解决方案

2.1 detach 后 stale BRK 竞态

问题:快速 attach/detach 场景下,detach 已完成但 guest vCPU 仍在执行 BRK 指令,触发 EC_60/Brk64 panic原因:BRK 写入到 guest 内存后,vCPU 可能已 fetch 该指令但尚未执行;detach 恢复原指令后 vCPU 仍会命中 BRK。 解决方案:在 handler 中增加 stale-BRK 检测——若当前 PC 处已无注册探针,识别为 stale BRK,恢复原指令并跳过 eBPF 回调,不触发 panic。

2.2 guest 退出窗口过短导致验证失败

问题:默认 guest 启动后快速退出,attach 命令来不及执行。 解决方案:引入 keepalive 模式的 guest 镜像,延长交互窗口,确保 attach/verify/detach 有充足时间。

2.3 cpu_ids vs phys_cpu_ids 语义差异

问题phys_cpu_ids = [1] 在当前配置路径中不生效,导致预期的 CPU 亲和性未应用。 现状:以 cpu_ids = [1] 为准(当前配置解析实现决定),已在验证中统一使用。


三、关键验证记录

日期 验证动作 结果
02-22 trace kprobe ... --inject 解析链路 已可解析并进入注册路径;guest 退出窗口下会回滚,且无脏项残留
02-24 引入 keepalive 镜像并复验 attach 解决交互窗口问题;仍出现过 VM TTBR1_EL1 is not ready 的时序失败并自动回滚
02-25 stale-BRK 修复后复验 + 压测 attach → fire → detach 可复现通过;3 轮快速压测无 Brk64 panic

补充说明:

  • 高频热点下 hprobe_entry 仍可能产生 OOB 日志噪声,本周验证主用 printk 规避干扰。

四、工作量统计

仓库 提交数 变更文件数 新增 删除
axebpf 2 12 +1125 -210
axvisor 2 4 +108 -5

本期关键新增 / 变更文件

  • src/probe/kprobe/addr_translate.rs(地址翻译机制扩展)
  • src/probe/kprobe/manager.rs(BrkInject 核心逻辑)
  • src/probe/kprobe/handler.rs(stale-BRK 恢复)
  • tests/guest_addr_translate_tests.rstests/guest_kprobe_handler_tests.rstests/guest_kprobe_manager_tests.rs(新增测试)
  • kernel/src/vmm/mod.rs(VMM hook 注册)

五、当前判断

  • BrkInject 路径已达到"本阶段可验收"的稳定度,建议继续作为 guest-kprobe 的主验证通道。
  • Stage-2 fault 路径仍未完善,当前策略保持"明确标注限制 + 不作为本周验收前置条件"。

六、遗留问题

问题 现状 影响 解决方向
Stage-2 fault 命中后恢复不完整 缺少 MDSCR_EL1.SS + EC::SingleStepLowerEL 完整机制 命中点可能重复 fault,形成忙循环 实现 single-step 基础设施,命中后单步执行原指令再重新挂 XN
interrupt_mode = "emu"/"no_irq" 路径未实现 仍可能触发 not yet implemented panic 无法覆盖所有中断模式场景 按需补齐分支或显式拒绝不支持的模式
全仓 clippy 基线问题 cargo xtask clippy 受历史 lint 阻塞 本功能线无法独立完成质量门禁 分批清理历史 lint,或在 CI 中按模块单独检查

七、提交摘要

仓库 提交 说明
axvisor 4f3f5d1 guest-kprobe VMM hook 注册 + --inject 命令链路接入
axvisor 55db87c 同步 axebpf 子模块到 guest-kprobe 实现版本
axebpf 452e641 地址翻译 hook、BrkInject 核心实现、stale-BRK 恢复 + 测试
axebpf 2383fa5 文档:guest-kprobe 集成验证指南更新

八、下周计划

优先级 任务 验收标准
P0 Stage-2 单步恢复基础设施 命中后可执行原指令并重新挂回 XN,不再循环 fault
P0 稳定化 BrkInject 验证脚本 固化一键复验流程(build/attach/stream/detach)并可重复通过
P1 降低高频热点下 OOB 噪声 hprobe_entry 在热点函数下可稳定运行
P1 清理 clippy 历史阻塞项 cargo xtask clippy 在主线配置可通过

九、个人复盘

这周最大的变化不是"新增了多少功能",而是验证方法本身被固化了

之前的问题是多因素叠加:命令解析、guest 生命周期窗口、detach 竞态——任一环节出问题都会让结论失真。现在通过 keepalive 基线和 stale-BRK 恢复策略,BrkInject 已经具备重复回放能力,后续可以把精力集中在 Stage-2 单步机制完善,而不是反复排查环境偶发因素。

另一个收获是:地址翻译的 hook 解耦设计证明了可行性——axebpf 不直接依赖 VMM 实现,而是通过回调注册让 VMM 在启动时注入翻译能力,这使得 guest-kprobe 模块可以独立测试(4 个新增测试文件均不依赖完整 VMM 环境)。