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 依赖复用
| 组件 | 来源 | 复用方式 | 用途 | 阶段 |
|---|---|---|---|---|
| ksym | Starry-OS | 直接引用 | 符号表生成与查找 | Phase 1 |
| tracepoint | Starry-OS | 直接引用 | 追踪点框架 | Phase 1 |
| tp-lexer | Starry-OS | 直接引用 | 过滤表达式解析 | Phase 3 |
| kbpf-basic | Starry-OS | fork 引用 | eBPF Map/ringbuf | Phase 2 |
| rbpf | 社区 | 直接引用 | eBPF VM | Phase 2 |
| kprobe | Starry-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.rs | EbpfVm 结构体封装 |
| 程序加载 | execute(), execute_with_mem() |
4.2 Week 4: Helper 与 Map
| 任务 | 说明 |
|---|---|
helpers.rs | 标准 Helper 函数实现 |
maps.rs | 封装 kbpf-basic |
| Map 类型 | HashMap, Array, RingBuf |
Helper 函数清单:
| Helper ID | 函数名 | 功能 |
|---|---|---|
| 1 | bpf_map_lookup_elem | 查找 Map 元素 |
| 2 | bpf_map_update_elem | 更新 Map 元素 |
| 3 | bpf_map_delete_elem | 删除 Map 元素 |
| 5 | bpf_ktime_get_ns | 获取时间戳 |
| 6 | bpf_trace_printk | 调试输出 |
| 8 | bpf_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_enter | AxVCpu::run() 入口 | vm_id, vcpu_id, timestamp |
vmm:vcpu_run_exit | AxVCpu::run() 返回 | vm_id, vcpu_id, exit_reason, duration_ns |
vmm:hypercall | Hypercall 处理 | vm_id, vcpu_id, nr, args, duration_ns |
vmm:mmio_read | MmioRead 处理 | vm_id, addr, width, duration_ns |
vmm:mmio_write | MmioWrite 处理 | vm_id, addr, width, data, duration_ns |
vmm:interrupt_inject | 中断注入 | vm_id, vcpu_id, vector |
vmm:ept_violation | NestedPageFault | vm_id, gpa, access_flags, duration_ns |
| 任务 | 说明 |
|---|---|
| 定义 VMM 追踪点 | 使用 define_tracepoint! 宏 |
| axvcpu 插桩 | AxVCpu::run() 方法 |
| Exit 处理插桩 | Hypercall, MMIO, EPT violation |
| Hypervisor Helper | vm_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 | 函数名 | 功能 |
|---|---|---|
| 100 | bpf_get_current_vm_id | 获取当前 VM ID |
| 101 | bpf_get_current_vcpu_id | 获取当前 vCPU ID |
| 102 | bpf_get_exit_reason | 获取 VM Exit 原因 |
| 103 | bpf_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 组件
| 组件 | 链接 |
|---|---|
| ksym | https://github.com/Starry-OS/ksym |
| kbpf-basic | https://github.com/Starry-OS/kbpf-basic |
| tp-lexer | https://github.com/Starry-OS/tp-lexer |
| tracepoint | https://github.com/Starry-OS/tracepoint |
| kprobe | https://github.com/Starry-OS/kprobe |
| eBPF Discussion | https://github.com/orgs/Starry-OS/discussions/4 |
10.2 社区组件
| 组件 | 链接 |
|---|---|
| rbpf | https://github.com/qmonnet/rbpf |
| PREVAIL | https://github.com/vbpf/ebpf-verifier |
| Aya | https://aya-rs.dev/ |
| Linux eBPF 文档 | https://docs.kernel.org/bpf/ |