この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 209|答える: 3

【安全知識】 EBPF関連知識へのリンク

[リンクをコピー]
2025年10月20日 16:47:02 に投稿 | | |
この投稿は2025年10月21日09:20にSummerによって最終編集されました

https://github.com/iovisor/bcc/blob/master/docs/kernel-versions.md  ebpf对应的 内核版本特性 能解决什么问题 *
https://lore.kernel.org/bpf/ ebpf对应的内核ebpf补丁的信息讨论 *
https://juejin.cn/post/7084515511576313864 linux tracing system 各种tracing框架的对比 分为前端,tracing框架,探针 *




先の:. NET6における優先度キュー
次に:AIエージェントとAI MCP
 地主| 2025年10月20日 16:50:38に投稿 |
EBPFモジュールとカーネルモジュールの両方は、EBPF自身のデータソースではなくカーネルプローブのデータソースに対応しています
 地主| 2025年10月20日 16:59:33に投稿 |
Linuxの参考文献:Brother Bird's Linux著者 台湾語

ハイパーリンクのログインが見えます。
 地主| 2025年10月20日 19:30:47に投稿 |
https://www.cnblogs.com/revercc/p/17803876.html
eBPFのuprobeプログラムとkernel/events/uprobe.cの接続は、eBPFメカニズムがカーネルのネイティブuprobeインフラストラクチャを再利用してユーザー状態関数のフック機能を実装している点にあります。 具体的には、eBPFのuprobeはカーネルuprobeフレームワークの「アプリケーション」であり、内部のカーネルコールチェーンとデータ構造を介してリンクされています。
コア接続:eBPFはカーネルuprobeフレームワークに依存してフックを実装しています
カーネル uprobe.c は、Linux カーネルのネイティブユーザーステートプローブ(uprobe)のコア実装であり、以下の責任を担います:
ユーザー状態プローブ(例:register_uprobe()、unregister_uprobe()の登録およびキャンセル管理。
ブレークポイント挿入(x86のint3など)を対象関数アドレスにブレークポイント命令を書き込むこと。
ブレークポイントトリガーイベント(プログラムがブレークポイントに実行された際にカーネル状態処理に止まるもの)をキャプチャします。
事前登録済みのコールバック関数(すなわちフックロジック)を呼び出します。
eBPF uprobeプログラム(あなたが書いたhook libc.so の例)は、uprobeベースのeBPFコールバック関数をeBPFローダー(例:bcc、libbpf)を通じてカーネルにレジスタします。これはuprobe.cが提供するインフラストラクチャに完全に依存しています。
特定の呼び出しチェーン:eBPFプログラムからuprobe.cへのフロー
uprobeをeBPFローダー(例えばbcc attach_uprobe)で登録すると、その基礎となるプロセスは以下の通りです。
eBPFローダーは登録リクエストを開始します。ローダー(例えばbccのPythonコード)は、システムコール(bpf()やperf_event_open()))を通じてカーネルに「libc.so のopenat関数にeBPFフックをハングしたい」と伝え、eBPFプログラムのバイトコードを渡します。
eBPFプログラムのカーネル検証と準備カーネルeBPF検証器は、カーネルのセキュリティが損なわれていないかプログラムの正当性を確認します。 合格したら、eBPFプログラムをカーネルに読み込み、「eBPFコールバック関数」(つまりあなたが書いたuprobe_openatロジック)を用意します。
uprobe.cのレジストレーションインターフェースカーネルを再利用することで、uprobe.cのregister_uprobe()関数を呼び出し、「ネイティブuprobe」を登録し、eBPFコールバック関数をこのuprobeの「トリガーハンドラ」として使用します。
ここでのポイントはこうです:eBPFのuprobeの本質は、型eBPFのコールバックをカーネルのネイティブuprobeに結合することにあります。
uprobe.cはブレークポイントを挿入し、トリガーされるのを待ちます。Uprobe.cは登録されたターゲットアドレス(libc.so のopenatアドレス)に基づいてユーザーの状態メモリにブレークポイント命令(例えばx86のint3)を書き込み、そのブレークポイントの元の命令(トリガー後の実行再開用)を記録します。
関数はブレークポイントをトリガーし、uprobe.cはeBPFコールバックを呼び出します。アプリケーションがlibc.so:openatを呼び出すと、ブレークポイント命令を実行するとトラップが発生しカーネル状態に入ります。 現在:
カーネルはuprobe.cのuprobe_handler()関数(カーネル処理ロジック)を呼び出します。
uprobe_handler()はブレークポイントに対応する登録情報を確認し、eBPFコールバックにバインドされていることを判明し、eBPFプログラム(つまりあなたが書いたuprobe_openat)を呼び出します。
eBPFプログラムが実行された後(例:パラメータの収集、ringbufへの書き込み)、uprobe_handler()は元の命令を復元し、プログラムの実行を継続できるようにします。
概要:二人の関係
kernel/events/uprobe.cは基盤となるインフラストラクチャであり、ユーザー状態ブレークポイントの挿入、キャプチャ、リカバリーなどのコア機能を提供し、すべてのユーザー状態プローブ(eBPF uprobe、GDBデバッグなどを含む)の基盤となっています。
eBPFのuprobeプログラムはこのインフラに基づく上位層アプリケーションであり、eBPFコールバック関数をレジスタ付けし、uprobeがトリガーされた際にカーネルがeBPFロジックを実行することで、効率的なユーザー状態機能の追跡を実現します。
要するに、eBPFのuprobeは「ユーザー」、uprobe.cは「サービスプロバイダー」であり、前者は後者に依存してフックの登録、トリガー、実行を完成させます。
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com