# BPF arena memory ## 定義 BPF arena memory は、BPF プログラムの `.data`、`.bss`、ヒープなどのデータを一つの平坦なアドレス空間へ置き、arena ごとのアロケータで管理するメモリモデルである。Rust の所有するポインタを arena 内へ寄せ、`Vec`、`String`、`Box`、`BTreeMap` などの標準 `alloc` コレクションを BPF 上で扱いやすくする狙いがある。(Source: [[@2026__BPFConf2026__BPF in the Agentic Era (LSFMM 2026)]]) ## 配置モデル - vtable: `.data.rel.ro` または読み取り専用 array map - 定数・文字列: `.rodata` - グローバル変数: `.data/.bss` の読み書き可能 arena - ヒープ確保: `bpf_arena_alloc` による読み書き可能 arena `BTreeMap` のノードから子ノード、`Vec` からヒープバッファ、グローバル変数から map のルートまでを arena 内で接続する。`PTR_TO_FUNC` と `PTR_TO_BTF_ID` のようなカーネルポインタは arena に置けず、レジスタ、スタック、rodata に限定される。(Source: [[@2026__BPFConf2026__BPF in the Agentic Era (LSFMM 2026)]]) ## verifier との関係 平坦なアドレス空間はポインタの追跡を単純化し、BPF verifier が Rust の通常のデータ構造を扱う余地を広げる。ただし、arena ポインタとカーネルポインタの型境界、間接呼び出し、vtable、cleanup 時の一括解放は、引き続き静的検査と実行時検査の設計対象となる。(Source: [[@2026__BPFConf2026__BPF in the Agentic Era (LSFMM 2026)]]) ## 横断的知見 - **arena は単なる新しい map 型ではなく、Rust の標準メモリモデルを BPF の検証可能な領域へ写像する境界である**: スライドは arena を `Vec` や `BTreeMap` の利用可能性、間接呼び出し、panic cleanup と結び付けている。LWN の報告も、arena ごとのアロケータが verifier 制約を単純化する可能性を指摘する。(Source: [[@2026__BPFConf2026__BPF in the Agentic Era (LSFMM 2026)]], [[@2026__LWN__BPF in the agentic era]]) ## 未解決の問い - arena 内ポインタの寿命・エイリアス・境界を verifier がどこまで追跡できるか。 - arena メモリの一括解放と Rust の `Drop` 実行を、異常終了を含めてどう整合させるか。 - 大きな arena とカーネルメモリ圧力の関係をどう制限するか。 - vtable とカーネルポインタを分離する設計が、実際の Rust コンパイラ出力でどこまで安定するか。 - arena を用いる BPF プログラムの競合・再入・複数 CPU 実行をどう検証するか。 ## 関連 - 概念: [[BPF verifier]] / [[Rust-BPF]] / [[eBPF]] / [[BPF]] - エンティティ: [[libbpf]] / [[Aya]] - ソース: [[@2026__BPFConf2026__BPF in the Agentic Era (LSFMM 2026)]] / [[@2026__LWN__BPF in the agentic era]] ## 出典 - [[@2026__BPFConf2026__BPF in the Agentic Era (LSFMM 2026)]](p.12〜p.14: arena 配置、アロケータ、Rust データ構造) - [[@2026__LWN__BPF in the agentic era]](BPF arena とグローバルアロケータの提案)