# BPF
## 定義
BPF(BSD Packet Filter / Berkeley Packet Filter)は、[[Steven McCanne]] と [[Van Jacobson]] が[[LBNL]]で設計し 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]])
- **「カーネル内で集約してから転送」という情報削減パターンの起源**: 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 から eBPF へのアーキテクチャ拡張(2014年の Alexei Starovoitov/Daniel Borkmann による大幅拡張)を一次論文で ingest して、命令セット・verifier・マップ型の進化の詳細を横断的に整理する価値がある。
- BPF JIT コンパイラ(x86/arm64 等への機械語変換)は本 wiki では未カバー。[[カーネル内VM]] の JIT 化との関係を整理する。
## 関連
- 概念: [[eBPF]] / [[パケットフィルタリング]] / [[カーネル内VM]] / [[動的インストルメンテーション]] / [[テレメトリ]]
- エンティティ: [[Steven McCanne]] / [[Van Jacobson]] / [[LBNL]] / [[tcpdump]] / [[libpcap]]
- ソース: [[@1993__USENIX__The BSD Packet Filter A New Architecture for User-level Packet Capture]] / [[@2021__yuuk.io__Linux eBPF Tracing Technology]]
## 出典
- [[@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 を参照)