# BPF
## 定義
BPF(BSD Packet Filter / Berkeley Packet Filter)は、[[Steven McCanne]] と [[Van Jacobson]] が[[Lawrence Berkeley National Laboratory]]で設計し USENIX Winter 1993 で発表したカーネル内パケットフィルタリングアーキテクチャである([[@1993__USENIX__The BSD Packet Filter A New Architecture for User-level Packet Capture]])。レジスタベースの仮想機械命令セットと CFG(制御フローグラフ)ベースの評価エンジンにより、従来の CSPF(CMU/Stanford Packet Filter)の最大 20 倍の速度でパケットを選別する。ユーザ空間がフィルタプログラムをコンパイルしてカーネルへ渡し、カーネルが検証・実行する「ユーザ空間コンパイル + カーネル内実行」という分割モデルを確立した。tcpdump/libpcap の基盤エンジンとして普及し、のちの Linux eBPF([[eBPF]])の直接的な先祖となった。
## 仮想機械の設計
BPF VM は最小主義を原則とする。
| 要素 | 内容 |
|---|---|
| アキュムレータ A | 主演算レジスタ(32ビット) |
| インデックスレジスタ X | 間接アドレッシング |
| メモリストア M[16] | スクラッチ空間(16ワード) |
| 命令種別 | ld / ldx / st / stx / alu / jmp / ret |
| 分岐命令 | jt(jump-if-true) / jf(jump-if-false)の 2 フィールド付き条件分岐 |
この設計の核心は「パケットバッファへの直接 offset アクセス」と「CFG を構成する分岐命令」の組み合わせであり、典型的なフィルタ(IP かつ非 TCP 等)を最小命令数で短絡評価できる。
## CSPF との根本的差異
| 側面 | CSPF | BPF |
|---|---|---|
| 評価方式 | ツリー評価 | CFG/DAG 評価 |
| 短絡評価 | 困難 | 自然にサポート |
| メモリ管理 | パケットごとに割り当て/解放 | コピーなし direct access |
| 速度 | ベースライン | 最大 20 倍高速 |
## 設計原則と eBPF への継承
BPF が確立した以下の設計原則はすべて eBPF に引き継がれている。
1. **最小命令セット VM**: 汎用 CPU ではなくフィルタリング特化の命令を持つ
2. **verifier による安全性保証**: ユーザ提供コードをカーネルで実行する前に静的解析で安全性を確認する
3. **ユーザ空間コンパイル / カーネル内実行の分離**: フィルタロジックの柔軟性とカーネルの安全性を両立する
4. **コピー最小化**: 合格パケットのみユーザ空間へコピーし、不合格パケットのコピーコストを排除する
## 横断的知見
- **BPF の「最小 VM + verifier」パターンはカーネル内サンドボックスの原型である**: 1993 年の BPF が「ユーザ提供コードをカーネルで安全に実行する」という問題を最初に解いた。eBPF([[eBPF]])はその問題解の規模を大幅に拡大(フックポイント・命令セット・マップ型)したが、問題の定式化自体は BPF から変わっていない。(Source: [[@1993__USENIX__The BSD Packet Filter A New Architecture for User-level Packet Capture]], [[@2021__yuuk.io__Linux eBPF Tracing Technology]])
- **「最小 VM + verifier」の設計パターンがカーネル sandbox からアプリケーション拡張 sandbox へ適用された**: OSDI'25 の [[@2025__OSDI__Extending Applications Safely and Efficiently]] は、bpftime が eBPF バイトコードと verifier を流用して、ユーザ空間アプリケーション拡張の安全性を保証する。BPF/eBPF が確立した「ユーザ空間コンパイル + 検証 + カーネル/ホスト内実行」という分離モデルが、パケットフィルタからカーネル拡張、さらにアプリケーション拡張へと適用範囲を広げたことを示す。(Source: [[@1993__USENIX__The BSD Packet Filter A New Architecture for User-level Packet Capture]], [[@2025__OSDI__Extending Applications Safely and Efficiently]])
- **「カーネル内で集約してから転送」という情報削減パターンの起源**: BPF は「すべてコピーしてからフィルタ(ユーザ空間フィルタ)」ではなく「カーネル内でフィルタしてから最小コピー」という方向転換を行った。この「情報を最上流(カーネル)で絞る」設計は、本 wiki が eBPF 系論文群(LogReducer の `sys_write` インターセプト・KernelAgg のバイトカウンタ・ChainScope のカーネル内フィルタリング)で繰り返し観察してきたパターンの原点になる。(Source: [[@1993__USENIX__The BSD Packet Filter A New Architecture for User-level Packet Capture]], [[@2020__SAC__Black-box inter-application traffic monitoring for adaptive container placement]], [[@2023__ICSE__LogReducer - Identify and Reduce Log Hotspots in Kernel on the Fly]])
- **BPFの2レジスタ32ビットVMがeBPFで11レジスタ64ビットVMへ拡張された経緯が、パケット処理という一次適用ドメインの一次資料で数値化されている**: [[@2018__CoNEXT__The eXpress Data Path - Fast Programmable Packet Processing in the Operating System Kernel]] は、原初のBPF VM(2個の32ビットレジスタ・22命令)がeBPFで11個の64ビットレジスタへ拡張され、64ビットアーキテクチャのハードウェアレジスタと1対1対応することで効率的なJITコンパイルを可能にしたと記す。この拡張とC言語同等の呼び出し規約を持つ関数呼び出し命令の追加により、LLVM経由の(制限付き)C言語コンパイルが実現した。BPFの原論文(1993)とeBPFへの拡張を1本の論文内で対比できる一次資料は本頁で初めて追加された。(Source: [[@1993__USENIX__The BSD Packet Filter A New Architecture for User-level Packet Capture]], [[@2018__CoNEXT__The eXpress Data Path - Fast Programmable Packet Processing in the Operating System Kernel]] §3.2)
- **1993年の原論文が確立した「パケットフィルタ専用ミニVM」という用途は、2013年の拡張でトレーシング基盤へ転用された**: [[@1993__USENIX__The BSD Packet Filter A New Architecture for User-level Packet Capture]] が設計した BPF は tcpdump(8) のフィルタ式を高速実行することだけを目的としていたが、Gregg(2023)の教科書的な回顧によれば、2013年からの拡張(いわゆる eBPF)で安全性とリソースへの高速アクセスを提供する汎用のカーネル内実行環境に成長し、execsnoop(8) のようなトレースポイントベースのツールや BCC・bpftrace のプログラミング基盤として使われるようになった。原論文が確立した「ユーザ空間コンパイル + カーネル内検証・実行」という分割モデル自体は変わらず、適用対象だけがパケットフィルタからシステムトレーシング全般へ20年をかけて拡大したことが、1993年の一次論文と2023年の教科書的記述の両方から確認できる。(Source: [[@1993__USENIX__The BSD Packet Filter A New Architecture for User-level Packet Capture]], [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 1 イントロダクション]])
- **拡張BPFは「トレーシングツール」から「カーネルモードアプリケーション」という新しいカーネルモデルの構成要素へ格上げされた**: 同書3章は、拡張BPFを従来のユーザーモード/カーネルモードの二分法に「BPFヘルパー呼び出しを介してカーネル空間で動くカーネルモードアプリケーション」という第三の道として位置づけ、TUXウェブサーバー(カーネル内実装のウェブサーバー)と同列に扱う(図3-2)。1章がBPFを「トレーシングのための言語・実行基盤」として紹介したのに対し、3章はそれを「OSのカーネルモデル全体の中でどこに位置するか」という一段上の視座から捉え直しており、同一書籍内でも章によってBPFの説明レイヤーが異なることを示す。(Source: [[@1993__USENIX__The BSD Packet Filter A New Architecture for User-level Packet Capture]], [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 3 オペレーティングシステム]] §3.2.1)
- **「カーネル内で集約してから転送」という設計原則は、フロントエンドの開発コスト対プログラマビリティのトレードオフとしても具体的に定量化されている**: [[BPF]]/eBPF が確立した「ユーザ空間コンパイル+カーネル内実行」というモデルの上に、15章は BCC(任意の集計・出力型、C言語でカーネル側を書ける)と bpftrace(0個以上のキー別集計に限定、専用言語)というふたつのフロントエンドを対置する。BCC はプログラマビリティを最大化する代わりに開発コストが bpftrace の10倍(228行 対 28行)かかり、bpftrace は集計の型を限定する代わりに開発コストを下げる。「カーネル内集約による低オーバーヘッド」という設計原則(項目3参照)そのものは両者で共通だが、その集約ロジックを「誰が・どれだけ自由に書けるか」という次元でふたつのフロントエンドがトレードオフの両極を占めることを、具体的な行数・時間の実測値で示している。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 15 BPF]] 表15-1, §15.1.7)
- **BPF の「ユーザ空間コンパイル + カーネル内検証・実行」という分離は、エージェント時代には開発速度のボトルネックとして再評価される**: 1993 年の BPF が安全性のために確立した分離モデルは現在も中核だが、LWN と LSFMM 2026 の資料は、VM 起動、`veristat` の巨大ログ、専用 DSL がエージェントの反復を阻害すると報告する。提案される Rust-BPF は安全境界を除去せず、コンパイラ診断、実行時検査、構造化 verifier エラーを分担させて分離モデルのフィードバックを短くする。(Source: [[@1993__USENIX__The BSD Packet Filter A New Architecture for User-level Packet Capture]], [[@2026__LWN__BPF in the agentic era]], [[@2026__BPFConf2026__BPF in the Agentic Era (LSFMM 2026)]])
## 未解決の問い
- BPF から eBPF へのアーキテクチャ拡張(2014年の Alexei Starovoitov/Daniel Borkmann による大幅拡張)を一次論文で ingest して、命令セット・verifier・マップ型の進化の詳細を横断的に整理する価値がある。
- BPF JIT コンパイラ(x86/arm64 等への機械語変換)は本 wiki では未カバー。[[カーネル内VM]] の JIT 化との関係を整理する。
## 関連
- 概念: [[eBPF]] / [[BPF verifier]] / [[Rust-BPF]] / [[パケットフィルタリング]] / [[カーネル内VM]] / [[動的計装]] / [[テレメトリ]] / [[Extension Interface Model]] / [[DTrace]] / [[フレームグラフ]] / [[システムコール]] / [[XDP]]
- エンティティ: [[Steven McCanne]] / [[Van Jacobson]] / [[Lawrence Berkeley National Laboratory]] / [[tcpdump]] / [[libpcap]] / [[bpftime]] / [[BCC]] / [[bpftrace]] / [[Brendan Gregg]]
- ソース: [[@1993__USENIX__The BSD Packet Filter A New Architecture for User-level Packet Capture]] / [[@2021__yuuk.io__Linux eBPF Tracing Technology]] / [[@2025__OSDI__Extending Applications Safely and Efficiently]] / [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 1 イントロダクション]] / [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 3 オペレーティングシステム]] / [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 15 BPF]] / [[@2018__CoNEXT__The eXpress Data Path - Fast Programmable Packet Processing in the Operating System Kernel]] / [[@2026__LWN__BPF in the agentic era]] / [[@2026__BPFConf2026__BPF in the Agentic Era (LSFMM 2026)]]
## 出典
- [[@1993__USENIX__The BSD Packet Filter A New Architecture for User-level Packet Capture]](BPF の原典。設計・性能評価・CSPF 比較)
- [[@2021__yuuk.io__Linux eBPF Tracing Technology]](eBPF への発展の文脈で BPF を参照)
- [[@2025__OSDI__Extending Applications Safely and Efficiently]](bpftime が eBPF バイトコードと verifier を流用してアプリケーション拡張の安全性を保証)
- [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 1 イントロダクション]](§1.7.3.3、BPF の 2013 年拡張と BCC/bpftrace への発展の教科書的記述)
- [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 3 オペレーティングシステム]](§3.2.1 モノリシックカーネルモデルにおける拡張BPFの位置づけ、§3.4.4 BPFの起源とコンポーネント)
- [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 15 BPF]](表15-1 BCC/bpftrace 比較、§15.1.7 開発コストの実測比較(10倍の時間・行数))
- [[@2018__CoNEXT__The eXpress Data Path - Fast Programmable Packet Processing in the Operating System Kernel]](§3.2 BPFからeBPFへのレジスタ数・幅拡張の具体的数値。2/32ビット→11/64ビット)