# 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 を参照)