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

AxVisor eBPF 开发计划

基于移植 Starry-OS eBPF 工作的开发计划。

策略: Starry-OS 是基于 ArceOS 扩展的宏内核,AxVisor 是基于 ArceOS 扩展的 VMM, 大部分组件可直接引用或稍作适配。

参考: https://github.com/orgs/Starry-OS/discussions/4


1. 架构决策

1.1 模块结构

所有功能统一在 modules/axebpf 模块内实现,不创建独立的 axksym/axtracepoint 模块:

modules/axebpf/
├── Cargo.toml
├── src/
│   ├── lib.rs           # 模块入口,feature 控制
│   ├── symbols.rs       # 符号表管理 (封装 ksym)
│   ├── tracepoint.rs    # 追踪点框架 (封装 tracepoint)
│   ├── kprobe.rs        # 动态探针 (封装 kprobe)
│   ├── runtime.rs       # eBPF 运行时 (封装 rbpf)
│   ├── verifier.rs      # 程序验证器
│   ├── helpers.rs       # Helper 函数实现
│   └── maps.rs          # Map 数据结构 (封装 kbpf-basic)

1.2 依赖复用

组件来源复用方式用途阶段
ksymStarry-OS直接引用符号表生成与查找Phase 1
tracepointStarry-OS直接引用追踪点框架Phase 1
tp-lexerStarry-OS直接引用过滤表达式解析Phase 3
kbpf-basicStarry-OSfork 引用eBPF Map/ringbufPhase 2
rbpf社区直接引用eBPF VMPhase 2
kprobeStarry-OS移植适配动态探针Phase 4
PREVAIL社区集成/实现验证器Phase 5

2. 开发阶段

2.1 时间线概览 (12 周)

Week 1-2        Week 3-4        Week 5-6        Week 7-8        Week 9-10       Week 11-12
   │               │               │               │               │               │
   ▼               ▼               ▼               ▼               ▼               ▼
┌───────┐     ┌───────┐      ┌───────┐      ┌───────┐      ┌───────┐      ┌───────┐
│Phase 1│────►│Phase 2│─────►│Phase 3│─────►│Phase 4│─────►│Phase 5│─────►│Phase 6│
│ 基础  │     │eBPF   │      │ VMM   │      │Kprobe │      │验证器 │      │测试   │
│ 设施  │     │运行时 │      │追踪点 │      │支持   │      │Uprobe │      │文档   │
└───────┘     └───────┘      └───────┘      └───────┘      └───────┘      └───────┘

3. Phase 1: 基础设施 (Week 1-2)

目标: 集成 Starry-OS 组件,建立符号表和追踪点基础设施

3.1 Week 1: 依赖集成

任务说明
添加 Starry-OS 依赖ksym, kbpf-basic, tp-lexer, tracepoint
创建 modules/axebpf基础模块结构
实现 symbols.rs封装 ksym,符号查找 API
xtask symbols编译时符号表生成

3.2 Week 2: 追踪点框架

任务说明
实现 tracepoint.rs封装 tracepoint 库
TracepointManager追踪点注册、enable/disable
define_tracepoint! 宏AxVisor 追踪点定义宏

交付物:

  • modules/axebpf 模块
  • xtask symbols 命令
  • 追踪点定义宏可用

4. Phase 2: eBPF 运行时 (Week 3-4)

目标: 移植 rbpf VM,实现程序加载和执行

4.1 Week 3: rbpf 集成

任务说明
rbpf 集成适配 no_std (default-features = false)
runtime.rsEbpfVm 结构体封装
程序加载execute(), execute_with_mem()

4.2 Week 4: Helper 与 Map

任务说明
helpers.rs标准 Helper 函数实现
maps.rs封装 kbpf-basic
Map 类型HashMap, Array, RingBuf

Helper 函数清单:

Helper ID函数名功能
1bpf_map_lookup_elem查找 Map 元素
2bpf_map_update_elem更新 Map 元素
3bpf_map_delete_elem删除 Map 元素
5bpf_ktime_get_ns获取时间戳
6bpf_trace_printk调试输出
8bpf_get_smp_processor_id获取 CPU ID

交付物:

  • eBPF 程序加载和执行
  • 标准 Helper 函数 (6 个)
  • Map 数据结构支持

5. Phase 3: VMM 追踪点与 Shell (Week 5-6)

目标: 定义 Hypervisor 追踪点,实现 Shell 命令

5.1 Week 5: VMM 追踪点

追踪点列表:

追踪点触发位置采集数据
vmm:vcpu_run_enterAxVCpu::run() 入口vm_id, vcpu_id, timestamp
vmm:vcpu_run_exitAxVCpu::run() 返回vm_id, vcpu_id, exit_reason, duration_ns
vmm:hypercallHypercall 处理vm_id, vcpu_id, nr, args, duration_ns
vmm:mmio_readMmioRead 处理vm_id, addr, width, duration_ns
vmm:mmio_writeMmioWrite 处理vm_id, addr, width, data, duration_ns
vmm:interrupt_inject中断注入vm_id, vcpu_id, vector
vmm:ept_violationNestedPageFaultvm_id, gpa, access_flags, duration_ns
任务说明
定义 VMM 追踪点使用 define_tracepoint! 宏
axvcpu 插桩AxVCpu::run() 方法
Exit 处理插桩Hypercall, MMIO, EPT violation
Hypervisor Helpervm_id, vcpu_id, exit_reason

5.2 Week 6: Shell 命令

命令功能
trace list列出所有追踪点
trace enable <tp>启用追踪点
trace disable <tp>禁用追踪点
trace stat显示统计信息
trace load <path>加载 eBPF 程序
trace latency <type>延迟直方图

Hypervisor Helper:

Helper ID函数名功能
100bpf_get_current_vm_id获取当前 VM ID
101bpf_get_current_vcpu_id获取当前 vCPU ID
102bpf_get_exit_reason获取 VM Exit 原因
103bpf_get_guest_regs获取 Guest 寄存器

交付物:

  • VMM 追踪点可用 (7+ 个)
  • Shell trace 命令组
  • Hypervisor Helper (4 个)
  • 端到端演示

6. Phase 4: Kprobe/Kretprobe 支持 (Week 7-8)

目标: 移植 Starry-OS kprobe 实现,支持动态探针

6.1 Week 7: Kprobe 移植

任务说明
kprobe 库移植从 Starry-OS 移植
kprobe.rs封装 kprobe API
断点机制架构相关实现

6.2 Week 8: Kretprobe 与多架构

任务说明
kretprobe函数返回探针
aarch64 适配ARM64 断点机制
x86_64 适配x86 断点机制
Shell 集成trace kprobe/kretprobe 命令

交付物:

  • Kprobe/Kretprobe 支持
  • 动态探针 Shell 命令
  • 多架构支持 (aarch64, x86_64)

7. Phase 5: 验证器与 Uprobe (Week 9-10)

目标: 实现 eBPF 验证器,探索 Uprobe 支持

7.1 Week 9: 验证器

任务说明
验证器研究PREVAIL 或自实现
verifier.rs验证器模块
安全检查内存边界、程序终止性

验证项目:

检查项目的
程序终止性防止无限循环
内存边界防止越界访问
类型安全防止类型混淆
栈边界防止栈溢出

7.2 Week 10: Uprobe 研究

任务说明
可行性研究Guest 用户态追踪
挑战分析地址空间隔离、性能影响
原型实现如可行,实现基础 Uprobe

Uprobe 挑战:

  • Guest 用户态地址空间隔离
  • 跨 VM 的断点管理
  • 性能影响评估

交付物:

  • eBPF 验证器
  • 安全加载不受信程序
  • Uprobe 可行性报告/原型

8. Phase 6: 测试与文档 (Week 11-12)

目标: 全面测试,编写文档,性能优化

8.1 Week 11: 测试

任务说明
单元测试symbols, runtime, helpers, maps
集成测试追踪点触发、eBPF 执行、kprobe
性能测试追踪点开销、eBPF 执行延迟
多架构验证aarch64, x86_64

8.2 Week 12: 文档与优化

任务说明
性能优化基于测试结果优化
用户文档使用指南
API 文档开发者文档
代码审查代码质量检查

性能目标:

  • 追踪点禁用时:开销 < 1%
  • 追踪点启用时:开销 < 5%
  • eBPF 程序执行:< 1μs

交付物:

  • 完整测试套件
  • 性能基准测试报告
  • 用户文档和 API 文档

9. 未来扩展

9.1 Rust 异步追踪 (研究方向)

问题: 现有 eBPF 追踪方案基于同步执行模型,无法有效追踪 Rust async/await 异步代码:

  • 执行碎片化: async 函数在 await 点被拆分为多个状态机片段
  • 上下文丢失: Future 在不同执行器线程间迁移
  • 状态机隐藏: 编译器生成的状态机代码与源码结构差异大

研究方向: 探索针对 Rust async runtime 的专用追踪方案。


10. 参考资源

10.1 Starry-OS 组件

组件链接
ksymhttps://github.com/Starry-OS/ksym
kbpf-basichttps://github.com/Starry-OS/kbpf-basic
tp-lexerhttps://github.com/Starry-OS/tp-lexer
tracepointhttps://github.com/Starry-OS/tracepoint
kprobehttps://github.com/Starry-OS/kprobe
eBPF Discussionhttps://github.com/orgs/Starry-OS/discussions/4

10.2 社区组件

组件链接
rbpfhttps://github.com/qmonnet/rbpf
PREVAILhttps://github.com/vbpf/ebpf-verifier
Ayahttps://aya-rs.dev/
Linux eBPF 文档https://docs.kernel.org/bpf/