2025/08/07 08:37 Bouncing on trampolines to run eBPF programs

ロボ子、eBPFが産業界でどんどん使われてるって知ってたかのじゃ?カーネル開発者もパフォーマンスを重視してるみたいじゃぞ。

はい、博士。eBPFトレーシングプログラムは、カーネルの実行と内部を監視するための重要なツールだと聞きました。

そうじゃ、そうじゃ!`fentry`、`fexit`、`modify return`、`iterator`とか、色々なプログラムがあるんじゃ。

`fentry`は関数の開始時に引数を記録、`fexit`は終了時に戻り値を記録、`modify return`は戻り値を置き換える、`iterator`はカーネルオブジェクトを反復処理するんですね。

その通り!例えば、`openat2`システムコールをフックして、ファイルオープンを監視できるんじゃ。すごいじゃろ?

従来のkprobeプログラムはブレークポイント命令で置き換えるため、オーバーヘッドが大きいと。eBPFトランポリンは、どうやってそれを解決するんですか?

いい質問じゃな、ロボ子!eBPFトランポリンは、例外を発生させる代わりに、カーネル関数が別の関数を呼び出すようにeBPFプログラムを呼び出すんじゃ。これでオーバーヘッドを減らせるってわけ。

なるほど!eBPFプログラムはネイティブ命令にコンパイルされないから、トランポリンがABIブリッジとして機能するんですね。呼び出し規約を変換する役割も担うとは。

そうなんじゃ!ftraceもトランポリンを使って、コンパイル時にNOP命令を挿入し、実行時にftraceハンドラー呼び出しで置き換えるんじゃ。

トランポリンは、フックされた関数の引数を「トレースコンテキスト」としてプログラムに渡すんですね。ARM64アーキテクチャでは、カスタムスタックを割り当てて引数を保存し、eBPFプログラムを呼び出すと。

`fexit`プログラムの場合、トランポリンは元の関数の実行順序を置き換えて、`fentry`、ターゲット関数、`fexit`プログラムを順に実行するんじゃ。

eBPF Foundationの支援で、BootlinのAlexis LothoréさんがARM64アーキテクチャのeBPFサポートを強化したんですね。具体的にはどんな改善があったんですか?

マルチkprobeの有効化と、8つ以上の引数を消費するARM64関数でのeBPFトレースプログラムのサポートじゃ!これで、より多くの関数を同時に監視できるようになったんじゃぞ。

カーネルバージョン6.16.0で利用可能になったんですね。ますますeBPFが便利になりますね!

そうじゃな!ところでロボ子、eBPFって、まるで忍者のようにカーネルの中をこっそり監視してるみたいじゃな。

確かにそうですね、博士。でも、忍者は隠れてるけど、eBPFはちゃんとログを残しますよ。

あはは!それもそうじゃな。でも、もしeBPFが忍者だったら、カーネルのバグを斬ってくれるかも…って、つまらんこと言ったのじゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。