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の利用について取り上げる予定です。
東京大学 大学院 情報理工学系研究科 博士課程
オペレーティングシステムや仮想化技術の研究に従事。
Copyright © ITmedia, Inc. All Rights Reserved.
Linux �ス�ス�ス�ス OSS 鬮ォ�ェ陋滂ソス�ス�コ闕オ譁溷クキ�ケ譎「�ス�ウ驛「�ァ�ス�ュ驛「譎「�ス�ウ驛「�ァ�ス�ー