BPFは以下のアーキテクチャでJITコンパイルをサポートしています。
| アーキテクチャ | 対応カーネル |
|---|---|
| x86-64 | 3.16 |
| ARM 64 | 3.18 |
| s390 | 4.1 |
| PowerPC 64 | 4.8 |
| SPARC 64 | 4.12 |
| MIPS | 4.13 |
| ARM 32 | 4.14 |
| x86-32 | 4.18 |
JIT機能を利用する場合、「CONFIG_BPF_JIT」「CONFIG_HAVE_EBPF_JIT」カーネルオプションを有効化する必要があります。また、「CONFIG_BPF_JIT_ALWAYS_ON」オプションを有効化した場合、常にJITでBPFが実行されるようになり、カーネルのコードからBPFインタープリタが除去されます。
これは、PoCで、BPFインタープリタのコードがガジェットとして利用されてしまったSpectre Variant 2対策の一環として導入された機能です。
なお、Spectre Variant 1のPoCでもeBPFが利用されていましたが、このときはJIT化されたコードを投機実行させていたため、JITの無効化が有効な対策の一つとなります。
JITの機能は以下のprocfsからコントロールできます
eBPFのJITコンパイラのコード(x86)は「arch/x86/bpf_jit_comp.c」にあります。もともとeBPFのアーキテクチャはJITがしやすいように設計されており、基本的にeBPF命令は1つのCPU命令に対応して変換されています。
今回はBPFの基礎として、BPFプログラムの作成方法、BPFの検証器、JITコンパイル機能などについて説明しました。
次回以降、本格的にBPFの機能を使っていきます。次回はネットワークに関連したBPFの利用について取り上げる予定です。
東京大学 大学院 情報理工学系研究科 博士課程
オペレーティングシステムや仮想化技術の研究に従事。
2018年上半期に話題になったSpectreとその変異、Linuxカーネルでの対応まとめ
2017年版Linuxカーネル開発レポート公開――支援している企業トップ10とは?
Linuxカーネルのソースコードを読んで、システムコールを探るCopyright © ITmedia, Inc. All Rights Reserved.