feat(ebpf): add RISC-V 64 eBPF JIT backend framework#1139
Conversation
…kend Add a modular JIT compilation backend for eBPF programs in the StarryOS kernel, with a hand-written RISC-V 64 code generator. Pass 1 computes instruction sizes and builds an offset table; pass 2 emits native code into executable (JitBuffer) memory. ## Architecture - JitBackend trait with per-architecture cfg-gated implementations - RISC-V 64 backend: ~830 lines supporting all ALU/JMP/MEM/CALL instructions with zero-division guards, BPF frame pointer offset adjustment, and AUIPC+load_imm+ADD+JALR pattern for PC-relative conditional jumps - x86_64 and aarch64 stubs included for future completion - 28 #[cfg(test)] unit tests for emit_load_imm64 boundaries and insn_size golden-match validation - JitBuffer: PAGE_SIZE-aligned executable buffer with icache/D-CVAU flush ## Testing - cargo fmt --check: passes - cargo xtask clippy --package starry-kernel: all 13 feature configs pass Signed-off-by: CN-TangLin <2242120212@qq.com>
… bpf_insn Remove unused cBPF constants (BPF_ABS, BPF_IND, BPF_LEN, BPF_MSH, BPF_K, BPF_PSEUDO_MAP_FD, BPF_PSEUDO_MAP_VALUE) and helper methods (new/to_bytes/ from_bytes) from BpfInsn that the JIT backends do not reference. Fix jit_x86_64 stub import paths (JitBackend/JitBuffer belong to super, not super::super). Add dead_code allowance to ebpf_jit and bpf_insn modules until they are wired in by follow-up PRs.
2f176dc to
62f8454
Compare
There was a problem hiding this comment.
eBPF JIT 框架 + RISC-V 64 后端 Review
变更概述
本 PR 为 StarryOS 内核添加 eBPF JIT 编译框架(JitBuffer、JitBackend trait、两遍编译器 JitCompiler),并实现完整的 RISC-V 64 后端(1487 行),同时为 x86_64 和 AArch64 提供空 stub。在 ebpf/mod.rs 中引入 bpf_insn 和 ebpf_jit 子模块,为后续 PR #893 将 JIT 接入执行路径做准备。
本地验证结果
cargo fmt --check:失败 — 3 个文件有格式问题(jit_aarch64.rsimport 排序、jit_x86_64.rsimport 格式、ebpf/mod.rs模块声明排序)cargo clippy --manifest-path os/StarryOS/kernel/Cargo.toml --all-features -- -D warnings:通过- 未运行 host test(内核 crate 不适合在 host 上 cargo test)
CI 状态
Check formatting / run_host(job 79665931983):failure — 由本 PR 的格式问题直接导致Run sync-lint / run_host:successDetect changed paths:successrun_container变体和Publish * container image:skipped(PR 来自 fork,预期行为)
前置评论
无现有 review 评论或 issue 评论。
重复/重叠分析
- base 分支上不存在
ebpf_jit、JitBackend、JitBuffer相关代码,本 PR 为首次引入 - 已有 eBPF 子系统来自 PR #848、#850、#886、#1081,本 PR 在其基础上构建 JIT,不重复
- fork 分支上有后续提交(AArch64 JIT 后端、x86_64 JIT 后端、JIT 接入执行路径),对应 PR #893
- 未发现与当前 open PR 有冲突或重叠
阻塞问题
-
CI 格式检查失败(
cargo fmt --check):3 个文件格式不符合要求,需运行cargo fmt修复:os/StarryOS/kernel/src/ebpf/ebpf_jit/jit_aarch64.rs第 1 行:use 导入排序应为{HelperFn, JitBackend, JitBuffer, bpf_insn::BpfInsn}os/StarryOS/kernel/src/ebpf/ebpf_jit/jit_x86_64.rs第 1-2 行:use 导入格式不符合 rustfmt 规范os/StarryOS/kernel/src/ebpf/mod.rs第 34-40 行:pub(crate) mod error等模块声明应排在bpf_insn/ebpf_jit之前
-
缺少测试覆盖:新增 1888 行代码(含 1487 行 RISC-V 64 JIT 后端),无任何单元测试。JIT 编译器的关键逻辑需要基本的正确性验证:
BpfInsn辅助方法(dst_reg/src_reg/class/size/is_ld_dw_imm)emit_load_imm64对各种立即数范围的编码- 分支指令 B-type 编码格式
insn_size与实际发射字节数的一致性- Prologue/Epilogue 栈帧大小是否匹配
-
unsafe impl Send/Sync for JitBuffer(ebpf_jit/mod.rs第 47-48 行)缺少 SAFETY 注释:JitBuffer持有裸指针并声明Send + Sync,需要 SAFETY 注释说明安全性保证。建议注释:指针指向 heap 分配的 JIT 代码页,finalize 后通过flush_icache_all()保证指令缓存一致性,buffer 生命周期由 Drop trait 管理。 -
JitBuffer::emit_u8/emit_u32(ebpf_jit/mod.rs第 71-86 行)静默丢弃越界写入:当缓冲区满时直接 return 不报错,会导致生成不完整的机器码而产生未定义行为。建议返回Result或至少debug_assert!(self.pos + N <= self.size)。 -
bpf_to_rv(jit_riscv64.rs第 61 行)对无效寄存器返回RV_ZERO:eBPF R0-R10 应只有 0-10 有效值,default 分支应使用unreachable!("invalid BPF register {r}")或至少debug_assert!,而非静默映射到 x0。 -
RISC-V 后端多处
unsafe块缺少 SAFETY 注释:emit_alu、emit_jmp中大量使用unsafe进行指令回填(branch fixup),每个unsafe块应说明:回填地址在buf.entry() + skip,偏移量skip < buf.offset()且在已分配缓冲区内。
其他观察
BPF_END(字节序转换)标记为未实现并使用warn!提醒,作为框架阶段可以接受- 两遍编译设计(pass1 sizing + pass2 emit)合理
- 寄存器映射和栈帧布局与 RISC-V ABI 一致
#[allow(dead_code)]标注合理,后续 PR 会接入执行路径
总结
框架设计方向正确,RISC-V 后端覆盖面完整。但存在 CI 格式失败、无测试、多处 unsafe 缺少 SAFETY 注释、缓冲区溢出静默丢弃等阻塞问题。建议修复格式、添加基本单元测试、补全 SAFETY 注释后重新提交。
Powered by mimo-v2.5-pro
问题
为 StarryOS 内核添加 eBPF JIT 编译支持。本 PR 是系列 PR 的第一步,建立跨架构 JIT 框架并实现 RISC-V 64 后端。
变更
核心框架 (
ebpf/ebpf_jit/mod.rs)JitBuffer结构体,支持emit_u8/emit_u32字节码发射和偏移追踪JitBackendtrait:jit_compile_one、jit_finalize_resolve_jmps、jit_get_entryJitCompiler结构体,实现两遍编译流程HelperFn辅助函数表类型RISC-V 64 JIT 后端 (
ebpf/ebpf_jit/jit_riscv64.rs)JitBackendtrait,覆盖所有 eBPF 指令的 RV64 翻译BPF 指令定义 (
ebpf/bpf_insn.rs)BpfInsn结构体增加dst_reg()、is_ld_dw_imm()等辅助方法模块组织 (
ebpf/mod.rs)pub(crate) mod bpf_insn和pub mod ebpf_jit#[allow(dead_code)]标注(后续 PR 会将 JIT 接入执行路径)其他架构 stub
JitBackend实现 stub,确保跨架构编译通过验证
cargo xtask clippy --package starry-kernel所有 13 项 feature 检查通过