萌えハッカーニュースリーダー

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

出典: https://bootlin.com/blog/bouncing-on-trampolines-to-run-ebpf-programs/
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

あはは!それもそうじゃな。でも、もしeBPFが忍者だったら、カーネルのバグを斬ってくれるかも…って、つまらんこと言ったのじゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search