3章eBPFプログラムの仕組み

前章では、BCCフレームワークを用いて簡単なeBPFの「Hello World」を確認しました。本章ではすべてC言語で書かれた「Hello World」プログラムの例を示し、BCCが水面下に隠している処理の詳細を理解できるようにします。

この章ではeBPFプログラムのソースコードが実行されるまでに何が起きているのかについても述べます。これを図示したのが図3-1です。

C言語(もしくはRust)のソースコードはeBPFのバイトコードにコンパイルされ、実行時にネイティブの機械語命令にJITコンパイルあるいは逐次翻訳される

図3-1 C言語(もしくはRust)のソースコードはeBPFのバイトコードにコンパイルされ、実行時にネイティブの機械語命令にJITコンパイルあるいは逐次翻訳される

eBPFプログラムはeBPFバイトコードの命令列です。アセンブリ言語でプログラムを書くように、eBPFプログラムをこのバイトコードで書くこともできます。ただし普通はバイトコードよりも扱いやすい高水準プログラミング言語を使います。少なくとも本書執筆時点では、ほぼすべてのeBPFコードはC言語で書かれており、それらがeBPFバイトコードにコンパイルされます†1

[†1] eBPFプログラムは徐々にRustでも書かれつつある。なぜならRustコンパイラはeBPFバイトコードをコンパイルターゲットとしてサポートしているためだ。

概念的には、このバイトコードはカーネル内にあるeBPF仮想マシンの中で動きます。

3.1 eBPF仮想マシン

eBPF仮想マシンは、その他の仮想マシンと同じように、コンピュータをソフトウェアで実装したものです。eBPF仮想マシンはeBPFのバイトコード命令列をプログラムとして受け取り、その命令列を、システムが動作しているCPUで動くネイティブなマシン命令に翻訳します。 ...

Get 入門 eBPF ―Linuxカーネルの可視化と機能拡張 now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.