AxVisor eBPF 性能追踪 - 技术选型
本文档详细介绍 eBPF 工作原理、VMM 层支持需求,以及技术选型依据。
1. eBPF 技术原理
1.1 什么是 eBPF
eBPF (extended Berkeley Packet Filter) 是一种革命性的内核沙箱技术,允许在内核中安全地运行用户定义的程序,而无需修改内核源码或加载内核模块。
核心价值:
| 特性 | 传统方案 | eBPF 方案 |
|---|---|---|
| 添加追踪 | 修改源码 → 重编译 → 重启 | 运行时动态加载 |
| 安全性 | 可能导致内核崩溃 | 验证器保证安全 |
| 性能 | 日志 I/O 开销大 | 内核空间聚合,极低开销 |
| 灵活性 | 固定采集逻辑 | 可编程采集策略 |
1.2 eBPF 执行流程
┌─────────────────────────────────────────────────────────────────────────────┐
│ eBPF Complete Execution Flow │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ╔═════════════════════════════════════════════════════════════════════╗ │
│ ║ Compile Phase (Host) ║ │
│ ╠═════════════════════════════════════════════════════════════════════╣ │
│ ║ ║ │
│ ║ ┌────────────────┐ Rust/C ┌────────────────────────────┐ ║ │
│ ║ │ eBPF Source │ ──────────► │ eBPF Bytecode (.bpf ELF) │ ║ │
│ ║ │ (Rust + Aya) │ Compiler │ Platform-independent ISA │ ║ │
│ ║ └────────────────┘ └────────────────────────────┘ ║ │
│ ║ ║ │
│ ╚═════════════════════════════════════════════════════════════════════╝ │
│ │ │
│ ▼ Transfer to target system │
│ ╔═════════════════════════════════════════════════════════════════════╗ │
│ ║ Load Phase (Kernel) ║ │
│ ╠═════════════════════════════════════════════════════════════════════╣ │
│ ║ ║ │
│ ║ ┌────────────────┐ ┌────────────────────────────┐ ║ │
│ ║ │ ELF Parser │ ──────────► │ Bytecode + Map Defs │ ║ │
│ ║ └────────────────┘ └─────────────┬──────────────┘ ║ │
│ ║ │ ║ │
│ ║ ▼ ║ │
│ ║ ┌────────────────┐ Safety ┌────────────────────────────┐ ║ │
│ ║ │ Verifier │ ◄────────── │ Program Bytecode │ ║ │
│ ║ │ │ │ │ ║ │
│ ║ └───────┬────────┘ └────────────────────────────┘ ║ │
│ ║ │ ║ │
│ ║ │ Verification passed ║ │
│ ║ ▼ ║ │
│ ║ ┌────────────────┐ ┌────────────────────────────┐ ║ │
│ ║ │ JIT/Interpreter│ ──────────► │ Executable Program │ ║ │
│ ║ └────────────────┘ └─────────────┬──────────────┘ ║ │
│ ║ │ ║ │
│ ║ ▼ ║ │
│ ║ ┌────────────────────────────────────────────────────────────┐ ║ │
│ ║ │ Attach to Hook Point (Tracepoint/Kprobe) │ ║ │
│ ║ └────────────────────────────────────────────────────────────┘ ║ │
│ ║ ║ │
│ ╚═════════════════════════════════════════════════════════════════════╝ │
│ │ │
│ ▼ Event triggered │
│ ╔═════════════════════════════════════════════════════════════════════╗ │
│ ║ Execute Phase (Runtime) ║ │
│ ╠═════════════════════════════════════════════════════════════════════╣ │
│ ║ ║ │
│ ║ ┌──────────────┐ ┌──────────────┐ ┌──────────┐ ║ │
│ ║ │ Hook Trigger │ ───────► │ eBPF Program │ ◄──────► │ Maps │ ║ │
│ ║ │ (VM Exit etc)│ │ Execute │ R/W │ (Data) │ ║ │
│ ║ └──────────────┘ └──────┬───────┘ └────┬─────┘ ║ │
│ ║ │ │ ║ │
│ ║ │ Call │ Share ║ │
│ ║ ▼ ▼ ║ │
│ ║ ┌──────────────┐ ┌──────────┐ ║ │
│ ║ │ Helpers │ │ Userspace│ ║ │
│ ║ │(Kernel Svc) │ │ Read │ ║ │
│ ║ └──────────────┘ └──────────┘ ║ │
│ ║ ║ │
│ ╚═════════════════════════════════════════════════════════════════════╝ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
1.3 eBPF 核心组件详解
1.3.1 eBPF 字节码
eBPF 使用精简的 RISC 风格指令集,运行在虚拟的 64 位寄存器机器上:
| 组件 | 规格 | 说明 |
|---|---|---|
| 寄存器 | R0-R10 (64-bit) | R0=返回值, R1-R5=参数, R10=帧指针 |
| 栈空间 | 512 字节 | 固定大小,编译时确定使用量 |
| 指令大小 | 8 字节/指令 | 固定宽度,便于解析 |
| 程序大小限制 | 100万指令 (Linux 5.2+) | 防止无限循环 |
指令格式:
┌──────────┬──────────┬──────────┬──────────┬──────────────────┐
│ opcode │ dst_reg │ src_reg │ offset │ immediate │
│ 8 bits │ 4 bits │ 4 bits │ 16 bits │ 32 bits │
└──────────┴──────────┴──────────┴──────────┴──────────────────┘
1.3.2 eBPF Maps
Maps 是 eBPF 程序与用户态之间共享数据的核心机制:
┌─────────────────────────────────────────────────────────────────┐
│ eBPF Maps Mechanism │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Userspace Tool Kernel eBPF Program │
│ (ax-trace) (tracepoint handler) │
│ │ │ │
│ │ ┌────────────────────────┐ │ │
│ │ │ eBPF Map │ │ │
│ │ │ ┌─────────┬─────────┐ │ │ │
│ Read ──┼────►│ │ Key │ Value │ │◄────┼── Write │
│ Stats │ │ ├─────────┼─────────┤ │ │ Stats │
│ │ │ │ exit=1 │ 12345 │ │ │ │
│ │ │ │ exit=2 │ 6789 │ │ │ │
│ │ │ │ exit=3 │ 234 │ │ │ │
│ │ │ └─────────┴─────────┘ │ │ │
│ │ └────────────────────────┘ │ │
│ │
└─────────────────────────────────────────────────────────────────┘
支持的 Map 类型(本项目使用):
| Map 类型 | 数据结构 | 时间复杂度 | 典型用途 |
|---|---|---|---|
HashMap | 哈希表 | O(1) | 按 exit_reason 统计计数 |
Array | 固定数组 | O(1) | 延迟直方图桶 |
PerCPU HashMap | 每 CPU 哈希表 | O(1) | 避免锁竞争的统计 |
1.3.3 Helper 函数
eBPF 程序通过 Helper 函数访问内核服务,这是沙箱的受控出口:
| Helper ID | 函数名 | 功能 | 安全性 |
|---|---|---|---|
| 1 | bpf_map_lookup_elem | 查找 Map 元素 | 返回指针需边界检查 |
| 2 | bpf_map_update_elem | 更新 Map 元素 | 原子操作 |
| 5 | bpf_ktime_get_ns | 获取时间戳 | 只读,无副作用 |
| 6 | bpf_trace_printk | 调试输出 | 生产环境应禁用 |
1.3.4 验证器 (Verifier)
验证器是 eBPF 安全性的核心保障,通过静态分析确保程序安全:
验证内容:
| 检查项 | 目的 | 实现方式 |
|---|---|---|
| 程序终止性 | 防止无限循环 | 限制指令数 + 禁止向后跳转 |
| 内存安全 | 防止越界访问 | 追踪寄存器类型和范围 |
| 类型安全 | 防止类型混淆 | 抽象解释 + 类型推导 |
| 栈边界 | 防止栈溢出 | 静态分析栈使用量 |
Verification Flow
│
▼
┌───────────────────────┐
│ Build CFG (Control │
│ Flow Graph) │
└───────────┬───────────┘
│
▼
┌───────────────────────┐
│ Simulate each path │
│ Track register state │
└───────────┬───────────┘
│
▼
┌───────────────────────┐ ┌─────────────┐
│ Unsafe operation? │─Yes─►│ Reject Load │
└───────────┬───────────┘ └─────────────┘
│ No
▼
┌───────────────────────┐
│ Allow program │
└───────────────────────┘
1.4 eBPF 程序类型
与 Hypervisor 追踪相关的程序类型:
| 程序类型 | 触发时机 | 上下文数据 | 适用场景 |
|---|---|---|---|
| Tracepoint | 预定义的静态插桩点 | 结构化事件参数 | VM Exit 统计(核心) |
| Kprobe | 任意函数入口 | 寄存器状态 | 动态探测(扩展) |
| Kretprobe | 任意函数返回 | 返回值 + 寄存器 | 延迟测量(扩展) |
2. VMM 层 eBPF 支持需求分析
2.1 与标准 Linux eBPF 的差异
AxVisor 基于 ArceOS 自定义内核,需要从零实现 eBPF 支持:
| 组件 | Linux 实现 | AxVisor 需求 |
|---|---|---|
| 系统调用 | bpf() syscall | 不存在 → 直接 API |
| 符号表 | /proc/kallsyms | 不存在 → 编译时生成 |
| Tracepoint | 内核内置 trace_* | 不存在 → 移植 Starry-OS |
| Kprobe | 内核内置 | 不存在 → 移植 Starry-OS |
| 验证器 | 内核内置 | 可选 → 初期信任程序 |
2.2 Hypervisor 特权级问题
AxVisor 运行在更高特权级,传统 eBPF 设计需要适配:
┌─────────────────────────────────────────────────────────────────┐
│ Virtualization Privilege Levels │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ Guest OS (EL1 / Ring 0) │ │
│ │ Traditional Linux eBPF runs here │ │
│ │ Tracing targets: syscalls, kernel functions │ │
│ └───────────────────────────────────────────────────────────┘ │
│ ▲ │
│ │ VM Exit / VM Entry │
│ ▼ │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ AxVisor Hypervisor (EL2 / VMX Root) ◄── Our tracing layer│ │
│ │ │ │
│ │ Tracing targets: │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │ │
│ │ │ VM Exit │ │ Hypercall │ │ Interrupt Inject│ │ │
│ │ │ Latency │ │ Handling │ │ Latency │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────────┘ │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │ │
│ │ │EPT Handling │ │MMIO Emulate │ │ vCPU Scheduling │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────────┘ │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────┘ │
│ ▲ │
│ │ │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ Hardware │ │
│ └───────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
2.3 VMM 需要提供的支持
为在 AxVisor 中实现 eBPF 追踪,需要 VMM 层提供以下支持:
2.3.1 追踪点插桩
在 VMM 关键路径插入追踪点宏调用:
位置:modules/axvcpu/src/vcpu.rs
#![allow(unused)]
fn main() {
// AxVCpu::run() 方法中需要添加追踪点
pub fn run(&self) -> AxResult<AxVCpuExitReason> {
self.transition_state(VCpuState::Ready, VCpuState::Running)?;
// ▼ 追踪点:VM Entry
trace_vmm_vcpu_run_enter!(self.vm_id(), self.id());
let result = self.manipulate_arch_vcpu(VCpuState::Running, VCpuState::Ready, |arch_vcpu| {
arch_vcpu.run()
});
// ▼ 追踪点:VM Exit
if let Ok(ref exit_reason) = result {
trace_vmm_vcpu_run_exit!(self.vm_id(), self.id(), exit_reason);
}
result
}
}
2.3.2 上下文信息获取
eBPF 程序需要访问当前 VM/vCPU 上下文,VMM 需要提供:
| 信息 | 来源 | Helper 函数 |
|---|---|---|
| 当前 VM ID | AxVCpu::vm_id() | bpf_get_current_vm_id() |
| 当前 vCPU ID | AxVCpu::id() | bpf_get_current_vcpu_id() |
| 当前时间戳 | axhal::time::monotonic_time_nanos() | bpf_ktime_get_ns() |
2.3.3 时间测量基础设施
延迟统计需要高精度时间源,AxVisor 已有基础:
#![allow(unused)]
fn main() {
// 已存在于 ArceOS
pub fn monotonic_time_nanos() -> u64;
// 需要封装为 eBPF Helper
fn bpf_ktime_get_ns() -> u64 {
axhal::time::monotonic_time_nanos()
}
}
2.3.4 Exit Reason 编码
为统计分析,需要将 AxVCpuExitReason 编码为数值:
#![allow(unused)]
fn main() {
// 基于 modules/axvcpu/src/exit.rs
impl AxVCpuExitReason {
pub fn to_trace_code(&self) -> u32 {
match self {
Self::Hypercall { .. } => 1,
Self::MmioRead { .. } => 2,
Self::MmioWrite { .. } => 3,
Self::SysRegRead { .. } => 4,
Self::SysRegWrite { .. } => 5,
Self::IoRead { .. } => 6,
Self::IoWrite { .. } => 7,
Self::ExternalInterrupt { .. } => 8,
Self::NestedPageFault { .. } => 9,
Self::Halt => 10,
Self::CpuUp { .. } => 11,
Self::CpuDown { .. } => 12,
Self::SystemDown => 13,
Self::Nothing => 14,
Self::FailEntry { .. } => 15,
Self::SendIPI { .. } => 16,
}
}
}
}
3. 技术选型
3.1 选型原则
| 原则 | 说明 | 权重 |
|---|---|---|
| ArceOS 兼容 | 必须支持 #![no_std] 环境 | 必须 |
| Rust 优先 | 与 AxVisor 技术栈保持一致 | 高 |
| 许可证兼容 | 必须与 AxVisor 许可证兼容 | 必须 |
| 最小依赖 | 优先选择轻量级组件 | 中 |
| 可复用性 | 优先复用 Starry-OS 已验证组件 | 高 |
3.2 组件选型结果
| 功能 | 选择 | 来源 | 复用方式 | 阶段 |
|---|---|---|---|---|
| eBPF 虚拟机 | rbpf | 社区 | 适配 no_std | Phase 2 |
| eBPF Maps | kbpf-basic | Starry-OS | 直接引用 | Phase 2 |
| 符号表生成 | ksym | Starry-OS | 直接引用 | Phase 1 |
| 追踪点框架 | tracepoint | Starry-OS | 适配后复用 | Phase 1 |
| 过滤表达式 | tp-lexer | Starry-OS | 直接引用 | Phase 3 |
| 动态探针 | kprobe | Starry-OS | 移植适配 | Phase 4 |
| 验证器 | PREVAIL | 社区 | 集成或轻量实现 | Phase 5 |
3.3 各组件详解
3.3.1 rbpf - eBPF 虚拟机
| 属性 | 值 |
|---|---|
| 仓库 | https://github.com/qmonnet/rbpf |
| 许可证 | MIT |
| 语言 | Rust |
| JIT 支持 | x86_64 |
选择理由:
- 纯 Rust 实现,无 C 依赖
- 支持
# - 提供解释器和 JIT 两种执行模式
- API 简洁,易于集成
VM 类型:
| 类型 | 说明 | 适用场景 |
|---|---|---|
EbpfVmRaw | 接收原始字节缓冲区 | Tracepoint 事件(采用) |
EbpfVmNoData | 无输入数据 | 简单计算 |
3.3.2 kbpf-basic - eBPF Maps
| 属性 | 值 |
|---|---|
| 仓库 | https://github.com/Starry-OS/kbpf-basic |
| 许可证 | MIT/Apache-2.0 |
| no_std | ✅ |
支持的 Map 类型:
| 类型 | 说明 |
|---|---|
BPF_MAP_TYPE_ARRAY | 固定大小数组 |
BPF_MAP_TYPE_HASH | 动态哈希表 |
BPF_MAP_TYPE_LRU_HASH | LRU 淘汰哈希表 |
3.3.3 ksym - 内核符号表
| 属性 | 值 |
|---|---|
| 仓库 | https://github.com/Starry-OS/ksym |
| 许可证 | MIT/Apache-2.0 |
| no_std | ✅ |
功能:
- 编译时从 ELF 生成压缩符号表
- 运行时零拷贝查找
- 支持 Rust 符号 demangle
3.3.4 tracepoint - 追踪点框架
| 属性 | 值 |
|---|---|
| 仓库 | https://github.com/Starry-OS/tracepoint |
| 许可证 | MIT/Apache-2.0 |
| no_std | ✅ |
核心功能:
define_event_trace!宏定义追踪点- 线程安全的事件管理器
- 低开销的静态追踪点
3.3.5 kprobe - 动态探针
| 属性 | 值 |
|---|---|
| 仓库 | https://github.com/Starry-OS/kprobe |
| 许可证 | MIT/Apache-2.0 |
| no_std | ✅ |
| 架构支持 | x86_64, aarch64, riscv64, loongarch64 |
核心功能:
- kprobe: 函数入口探针
- kretprobe: 函数返回探针
- 断点机制适配多架构
- 与 eBPF 程序集成
3.3.6 PREVAIL - eBPF 验证器
| 属性 | 值 |
|---|---|
| 仓库 | https://github.com/vbpf/ebpf-verifier |
| 许可证 | MIT |
| 语言 | C++ |
核心功能:
- 内存边界检查
- 程序终止性验证
- 类型安全检查
- 独立于 Linux 内核
备选方案: 如 PREVAIL 集成困难,可实现轻量级验证器,仅检查关键安全属性。
3.4 许可证兼容性
| 组件 | 许可证 | 与 AxVisor 兼容 |
|---|---|---|
| rbpf | MIT | ✅ |
| kbpf-basic | MIT/Apache-2.0 | ✅ |
| ksym | MIT/Apache-2.0 | ✅ |
| tracepoint | MIT/Apache-2.0 | ✅ |
| tp-lexer | MIT/Apache-2.0 | ✅ |
| kprobe | MIT/Apache-2.0 | ✅ |
| PREVAIL | MIT | ✅ |
AxVisor 许可证: GPL-3.0-or-later OR Apache-2.0 OR MulanPubL-2.0
4. 架构设计
4.1 模块层次结构
架构决策: 统一在
modules/axebpf内实现所有功能,不创建独立的 axksym/axtracepoint 模块。
┌─────────────────────────────────────────────────────────────────────────────┐
│ AxVisor eBPF Tracing Architecture │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────────────────────────────────────────────────────────────┐ │
│ │ Shell Command Layer │ │
│ │ kernel/src/shell/commands/trace.rs │ │
│ │ ┌─────────────────────────────────────────────────────────────┐ │ │
│ │ │ trace list | enable | disable | stat | load | unload │ │ │
│ │ └─────────────────────────────────────────────────────────────┘ │ │
│ └───────────────────────────────────┬───────────────────────────────────┘ │
│ │ │
│ ┌───────────────────────────────────▼───────────────────────────────────┐ │
│ │ axebpf Module (Unified) │ │
│ │ modules/axebpf/ │ │
│ │ ┌──────────────────────────────────────────────────────────────┐ │ │
│ │ │ symbols.rs │ 符号表管理 (封装 ksym) │ │ │
│ │ ├──────────────────────────────────────────────────────────────┤ │ │
│ │ │ tracepoint.rs │ 追踪点框架 (封装 tracepoint/ktracepoint) │ │ │
│ │ ├──────────────────────────────────────────────────────────────┤ │ │
│ │ │ runtime.rs │ eBPF 运行时 (封装 rbpf VM) │ │ │
│ │ ├──────────────────────────────────────────────────────────────┤ │ │
│ │ │ helpers.rs │ Helper 函数 (ktime, trace_printk, vm_id...) │ │ │
│ │ ├──────────────────────────────────────────────────────────────┤ │ │
│ │ │ maps.rs │ Map 数据结构 (封装 kbpf-basic) │ │ │
│ │ └──────────────────────────────────────────────────────────────┘ │ │
│ └───────────────────────────────────┬───────────────────────────────────┘ │
│ │ Tracepoint Trigger │
│ ┌───────────────────────────────────▼───────────────────────────────────┐ │
│ │ VMM Tracepoint Calls │ │
│ │ modules/axvcpu/, modules/axvm/, kernel/src/vmm/ │ │
│ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │
│ │ │vcpu_run_* │ │ hypercall │ │ mmio_* │ │ ept_viol │ │ │
│ │ └────────────┘ └────────────┘ └────────────┘ └────────────┘ │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌───────────────────────────────────────────────────────────────────────┐ │
│ │ xtask Symbol Generation (Compile-time) │ │
│ │ xtask/src/symbols.rs │ │
│ │ ┌─────────────────────────────────────────────────────────────┐ │ │
│ │ │ cargo xtask symbols → 从 ELF 生成 kallsyms.bin │ │ │
│ │ └─────────────────────────────────────────────────────────────┘ │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌───────────────────────────────────────────────────────────────────────┐ │
│ │ Starry-OS Dependencies (Direct Reference) │ │
│ │ ┌────────┐ ┌────────────┐ ┌──────────┐ ┌──────┐ ┌───────────┐ │ │
│ │ │ ksym │ │ tracepoint │ │ tp-lexer │ │ rbpf │ │kbpf-basic │ │ │
│ │ └────────┘ └────────────┘ └──────────┘ └──────┘ └───────────┘ │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
4.2 数据流
┌─────────────────────────────────────────────────────────────────────────────┐
│ Tracing Data Flow │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ VMM Event eBPF Process User Query │
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ VM Exit │ │ eBPF │ │ trace │ │
│ │ Occurs │ ─────────────►│ Program │ │ stat │ │
│ └─────────┘ Trigger TP │ Execute │ └────┬────┘ │
│ └────┬────┘ │ │
│ │ │ │
│ ▼ Write │ Read │
│ ┌─────────┐ │ │
│ │ Maps │ ◄──────────────────┘ │
│ │ (Stats) │ │
│ └─────────┘ │
│ │
│ Example: VM Exit Statistics │
│ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ HashMap<VmExitKey, VmExitStats> │ │
│ │ ┌─────────────────────┬─────────────────────────────────┐ │ │
│ │ │ Key │ Value │ │ │
│ │ │ (vm=1, exit=Hyper) │ {count=12345, avg=1.2μs, ...} │ │ │
│ │ │ (vm=1, exit=MMIO) │ {count=6789, avg=2.3μs, ...} │ │ │
│ │ │ (vm=2, exit=Hyper) │ {count=4567, avg=1.5μs, ...} │ │ │
│ │ └─────────────────────┴─────────────────────────────────┘ │ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
4.3 依赖关系
架构决策: 所有功能统一在
modules/axebpf模块内实现,不创建独立的 axksym/axtracepoint 模块。 这样更简洁,减少模块间耦合。
modules/axebpf/
├── Cargo.toml
├── src/
│ ├── lib.rs # 模块入口
│ ├── symbols.rs # 符号表管理 (封装 ksym)
│ ├── tracepoint.rs # 追踪点框架 (封装 tracepoint)
│ ├── runtime.rs # eBPF 运行时 (封装 rbpf)
│ ├── helpers.rs # Helper 函数
│ └── maps.rs # Map 数据结构 (封装 kbpf-basic)
│
└── 依赖:
├── ksym (Starry-OS: 符号表生成与查找)
├── tracepoint (Starry-OS: 追踪点核心,package = "ktracepoint")
├── tp-lexer (Starry-OS: 过滤表达式)
├── rbpf (社区: eBPF VM)
└── kbpf-basic (Starry-OS: Maps)
xtask/
└── src/symbols.rs # 编译时符号表生成 (使用 ksym)
kernel (使用 ebpf feature)
└── axebpf # 单一依赖入口
5. 风险识别与缓解
| 风险 | 可能性 | 影响 | 缓解策略 |
|---|---|---|---|
| rbpf no_std 适配困难 | 中 | 高 | 优先评估,必要时 fork |
| 追踪点开销过高 | 低 | 中 | 设计时考虑禁用路径优化 |
| 多架构支持复杂 | 中 | 中 | 先完成 x86_64,再扩展 AArch64 |
| Starry-OS 组件不兼容 | 低 | 中 | 组件独立性高,可单独适配 |
6. 参考资源
6.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 |
6.2 eBPF 参考
| 资源 | 链接 |
|---|---|
| rbpf | https://github.com/qmonnet/rbpf |
| Aya (Rust eBPF) | https://aya-rs.dev/ |
| Linux eBPF 文档 | https://docs.kernel.org/bpf/ |
| eBPF 指令集规范 | https://www.ietf.org/archive/id/draft-thaler-bpf-isa-00.html |
| PREVAIL 验证器 | https://github.com/vbpf/ebpf-verifier |
6.3 非 Linux eBPF 实现参考
| 项目 | 说明 |
|---|---|
| eBPF for Windows | https://github.com/microsoft/ebpf-for-windows |
| Femto-Containers | https://github.com/future-proof-iot/Femto-Container |
| uBPF | https://github.com/iovisor/ubpf |