Skip to content

feat(ebpf): add RISC-V 64 eBPF JIT backend framework#1139

Closed
CN-TangLin wants to merge 2 commits into
rcore-os:devfrom
CN-TangLin:feat/ebpf-jit-1-riscv64
Closed

feat(ebpf): add RISC-V 64 eBPF JIT backend framework#1139
CN-TangLin wants to merge 2 commits into
rcore-os:devfrom
CN-TangLin:feat/ebpf-jit-1-riscv64

Conversation

@CN-TangLin

Copy link
Copy Markdown
Contributor

问题

为 StarryOS 内核添加 eBPF JIT 编译支持。本 PR 是系列 PR 的第一步,建立跨架构 JIT 框架并实现 RISC-V 64 后端。

变更

核心框架 (ebpf/ebpf_jit/mod.rs)

  • 定义 JitBuffer 结构体,支持 emit_u8 / emit_u32 字节码发射和偏移追踪
  • 定义 JitBackend trait:jit_compile_onejit_finalize_resolve_jmpsjit_get_entry
  • 定义 JitCompiler 结构体,实现两遍编译流程
  • 定义 HelperFn 辅助函数表类型

RISC-V 64 JIT 后端 (ebpf/ebpf_jit/jit_riscv64.rs)

  • 完整实现 JitBackend trait,覆盖所有 eBPF 指令的 RV64 翻译
  • 寄存器映射:BPF R0-R10 → RV64 t0-t6 / a0-a5 / s1
  • Prologue/Epilogue:保存/恢复 callee-saved 寄存器、分配栈帧
  • ALU/JMP/MEM 操作、辅助函数调用集成

BPF 指令定义 (ebpf/bpf_insn.rs)

  • 清理未使用的 cBPF 常量和方法,保留 eBPF 核心定义
  • BpfInsn 结构体增加 dst_reg()is_ld_dw_imm() 等辅助方法

模块组织 (ebpf/mod.rs)

  • 添加 pub(crate) mod bpf_insnpub mod ebpf_jit
  • 暂用 #[allow(dead_code)] 标注(后续 PR 会将 JIT 接入执行路径)

其他架构 stub

  • 为 x86_64 和 AArch64 提供空 JitBackend 实现 stub,确保跨架构编译通过

验证

  • cargo xtask clippy --package starry-kernel 所有 13 项 feature 检查通过
  • 本 PR 建立框架,JIT 实际接入执行路径由后续 PR893 完成

…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.
@CN-TangLin
CN-TangLin force-pushed the feat/ebpf-jit-1-riscv64 branch from 2f176dc to 62f8454 Compare June 5, 2026 04:30
@CN-TangLin
CN-TangLin changed the base branch from main to dev June 5, 2026 04:35
@CN-TangLin CN-TangLin closed this Jun 5, 2026

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

eBPF JIT 框架 + RISC-V 64 后端 Review

变更概述

本 PR 为 StarryOS 内核添加 eBPF JIT 编译框架(JitBufferJitBackend trait、两遍编译器 JitCompiler),并实现完整的 RISC-V 64 后端(1487 行),同时为 x86_64 和 AArch64 提供空 stub。在 ebpf/mod.rs 中引入 bpf_insnebpf_jit 子模块,为后续 PR #893 将 JIT 接入执行路径做准备。

本地验证结果

  • cargo fmt --check失败 — 3 个文件有格式问题(jit_aarch64.rs import 排序、jit_x86_64.rs import 格式、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:success
  • Detect changed paths:success
  • run_container 变体和 Publish * container image:skipped(PR 来自 fork,预期行为)

前置评论

无现有 review 评论或 issue 评论。

重复/重叠分析

  • base 分支上不存在 ebpf_jitJitBackendJitBuffer 相关代码,本 PR 为首次引入
  • 已有 eBPF 子系统来自 PR #848#850#886#1081,本 PR 在其基础上构建 JIT,不重复
  • fork 分支上有后续提交(AArch64 JIT 后端、x86_64 JIT 后端、JIT 接入执行路径),对应 PR #893
  • 未发现与当前 open PR 有冲突或重叠

阻塞问题

  1. 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 之前
  2. 缺少测试覆盖:新增 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 栈帧大小是否匹配
  3. unsafe impl Send/Sync for JitBufferebpf_jit/mod.rs 第 47-48 行)缺少 SAFETY 注释JitBuffer 持有裸指针并声明 Send + Sync,需要 SAFETY 注释说明安全性保证。建议注释:指针指向 heap 分配的 JIT 代码页,finalize 后通过 flush_icache_all() 保证指令缓存一致性,buffer 生命周期由 Drop trait 管理。

  4. JitBuffer::emit_u8/emit_u32ebpf_jit/mod.rs 第 71-86 行)静默丢弃越界写入:当缓冲区满时直接 return 不报错,会导致生成不完整的机器码而产生未定义行为。建议返回 Result 或至少 debug_assert!(self.pos + N <= self.size)

  5. bpf_to_rvjit_riscv64.rs 第 61 行)对无效寄存器返回 RV_ZERO:eBPF R0-R10 应只有 0-10 有效值,default 分支应使用 unreachable!("invalid BPF register {r}") 或至少 debug_assert!,而非静默映射到 x0。

  6. RISC-V 后端多处 unsafe 块缺少 SAFETY 注释emit_aluemit_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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant