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-03-02 至 2026-03-08)

开发分支


总结

本周核心进展:将 guest-kprobe 的 Stage-2 fault 路径从“已有基础设施但难以稳定命中”推进到“支持符号化定位、支持 deferred attach、可在 QEMU 中反复观测到命中 / 单步 / 恢复日志”的状态;同时保留 BrkInject 作为对照路径,用于验证 deferred attach 的时序处理是否正确。


一、已完成工作

1. 补齐 guest symbol 工作流

本周先补齐了 guest symbol 相关入口,完成了:

  • guest 符号表支持
  • trace kprobe vm<id>:<symbol> 形式的符号目标 attach
  • trace list 中目标地址的符号化展示

这样后续排查 Stage-2 路径时,不再需要每次手工查地址,降低了验证成本。

2. Stage-2 single-step 基础能力完善

在 axebpf 侧完成了 restored-instruction single-step 基础设施,使 Stage-2 fault 命中后可以先放开执行权限、单步执行原指令、再恢复 XN,避免停留在简单的重复 fault 模式。

本周相关推进包括:

  • 补齐 guest TraceContext 中的 x0-x7 透传
  • 增加 VM 生命周期清理入口,减少 VM stop/restart 后的脏状态
  • 修复 multi-vCPU stepping race,并补强 manager 测试稳定性

3. deferred attach / auto-enable 机制落地

针对 TTBR1_EL1 尚未就绪时 attach 失败的问题,本周改为:

  • 允许先注册 probe,保留为 pending 状态
  • 等待 guest 首次满足条件后再 enable
  • shell 输出显式区分“attached”与“registered pending enable”

这让 trace kprobe 不再强依赖手工卡时序,也使 keepalive / 非 keepalive 场景都更容易复现。

4. 修复 Stage-2 huge-page barrier 下的 same-page fault

之前在 2MB Stage-2 barrier 页上,非目标 GVA 的 execute fault 会被视为 unhandled,导致 VM 直接退出。
本周在 handler / manager 中增加了同 barrier 页按 GPA 反查 probe 的逻辑,使这些 fault 能进入 page-step,再回到目标地址命中真正的 probe。

这一步是本周 Stage-2 路径从“偶尔看见 fault”到“可以连续命中”的关键修复。

5. QEMU 侧完成 deferred attach + Stage-2 命中验证

本周在单核 keepalive guest 上完成了多轮 QEMU 复验,已经能稳定看到以下关键证据:

  • deferred enable
  • auto-enabled after VM-exit
  • stage2 page-step
  • matched stage2 fault
  • single-step complete / XN restored

对照路径上,BrkInject 也验证了 deferred attach 行为,说明“先注册、后启用”的时序方案本身是成立的。


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

2.1 TTBR1_EL1 时序不稳定

问题:VM 刚启动时,guest-kprobe attach 可能早于 TTBR1_EL1 初始化,导致地址翻译失败。
解决方案:引入 deferred attach;attach 阶段只登记,启用阶段延后到 guest 首次运行后。

2.2 2MB barrier 页上的非目标 fault 会把 VM 打死

问题:Stage-2 XN 命中后,同一 barrier 页上的其他指令也会触发 execute fault;旧逻辑只接受“精确命中目标地址”,因此把同页 fault 当成异常退出。
解决方案:改为按 barrier 页范围识别 stepping 状态,并支持 same-page page-step。


三、关键验证记录

3.1 Stage-2 路径

关键日志文件:

  • tmp/logs/ax_stage2_deferred_fix_1773052351.raw.log
  • tmp/logs/ax_stage2_trace_list_1773052397.raw.log

关键现象:

  • 出现 deferred enable vm1:0xffff800000002878 until TTBR1_EL1 is ready
  • 出现 auto-enabled deferred probe vm1:0xffff800000002878
  • 出现 stage2 page-step vm1 fault_gva=... probe_gva=0xffff800000002878
  • 出现 matched stage2 fault vm1 gva=0xffff800000002878 prog_id=0
  • 出现 single-step complete vm1:0xffff800000002878 on cpu1, XN restored

其中 ax_stage2_trace_list_1773052397.raw.log 中可观察到多次连续的 matched stage2 fault,说明命中不是一次性的偶发行为。

3.2 BrkInject 对照路径

关键日志文件:

  • tmp/logs/ax_brk_deferred_1773052020.raw.log
  • tmp/logs/ax_brk_deferred_wait_1773052087.raw.log

关键现象:

  • deferred enable 生效
  • auto-enable 生效
  • 能看到 BRK hit vm1:0xffff800000002878, pending single-step on cpu1

BrkInject 对照结果说明:deferred attach 机制本身工作正常,Stage-2 路径的问题主要集中在 barrier page-step 与恢复流程。

3.3 构建 / 测试记录

  • cargo test -p axebpf --features guest-kprobe,test-utils,runtime,tracepoint-support --test guest_kprobe_manager_tests:通过
  • cargo test -p axebpf --features guest-kprobe,test-utils,runtime,tracepoint-support --test guest_kprobe_handler_tests:通过
  • cargo xtask build:通过
  • cargo xtask clippy:仍被仓库既有 lint 阻塞,当前主要落在 modules/axvmconfigmodules/axebpf

四、提交摘要

本周主线提交

仓库 提交 说明
axvisor 5534c54 支持 guest symbol 命令和 symbol-target kprobe
axvisor da90229 trace list 支持 guest-kprobe 符号化显示
axvisor 7edcfc1 接入 guest-kprobe Stage-2 hook
axebpf 24b5738 restored-instruction single-step
axebpf 8df1b19 guest symbol table
axebpf c7c669c VM lifecycle cleanup entrypoints
axebpf cd59d31 guest x0-x7 透传到 TraceContext
axebpf 6996e05 修复 multi-vCPU stepping race
axebpf ae803a6 稳定 manager 测试

本周收口补充(2026-03-09)

仓库 提交 说明
axebpf 54740f1 deferred attach:允许先注册、首次条件满足后 enable
axvisor d379ab7 shell 侧支持 pending attach 提示
axvisor ac1068a 将 VM-exit 通知收回 root,去掉对 axvm 新接口的依赖

六、遗留问题

问题 现状 影响 解决方向
多核下的 Stage-2 TLB shootdown 当前按单核基线处理 多核场景可能需要更精确的跨核失效 后续按需补 SGI / per-VMID TLBI 方案
Stage-2 路径长期稳定性 已可重复命中,但仍以 keepalive 单核 guest 为主 复杂 guest / 多核 guest 下仍需扩展验证 继续补多场景回归脚本和日志对照

七、下周计划

优先级 任务 验收标准
P0 固化 Stage-2 / BrkInject 双路径回归脚本 一键复现 attach → hit → detach,日志可自动收集
P0 继续收敛 deferred attach 行为 start-before-attach / attach-before-start 两种路径均可稳定复现
P1 评估多核 shootdown 需求边界 明确 3.2 是否需要 SGI / per-CPU 失效
P1 清理 guest-kprobe 相关 clippy 历史项 至少不再被当前改动链路新增 lint 阻塞

八、个人复盘

如果没有 deferred attach,很多失败其实只是时序问题;如果没有 same-page page-step,很多 fault 又会被误判成实现错误。把这两类问题拆开后,Stage-2 路径终于从“看起来快通了”变成“能用日志反复证明已经通了哪一段、还差哪一段”。