周报(2026-03-02 至 2026-03-08)
开发分支
- axvisor: https://github.com/Iscreamx/axvisor/tree/feature/ebpf
- axebpf: https://github.com/Iscreamx/axebpf/tree/main
总结
本周核心进展:将 guest-kprobe 的 Stage-2 fault 路径从“已有基础设施但难以稳定命中”推进到“支持符号化定位、支持 deferred attach、可在 QEMU 中反复观测到命中 / 单步 / 恢复日志”的状态;同时保留 BrkInject 作为对照路径,用于验证 deferred attach 的时序处理是否正确。
一、已完成工作
1. 补齐 guest symbol 工作流
本周先补齐了 guest symbol 相关入口,完成了:
- guest 符号表支持
trace kprobe vm<id>:<symbol>形式的符号目标 attachtrace 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.logtmp/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.logtmp/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/axvmconfig与modules/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 路径终于从“看起来快通了”变成“能用日志反复证明已经通了哪一段、还差哪一段”。