6章eBPF検証器

eBPFによる検証プロセスについて、これまで何回か言及してきました。eBPFプログラムをカーネルにロードするときは、検証プロセスによってプログラムが安全であることを保証しています。本章では検証器がどのようなことをしているのかについて述べます。

「検証(verification)」とは、プログラムを通して考えうるすべての実行経路をチェックし、どの命令も安全であると保証することを指します。検証器は実行の準備のためにバイトコードの更新もします。検証プロセスが失敗する例もいくつか紹介する予定です。まずは正常に動くコードを紹介して、その後に検証器に不合格とみなされるようにコードを書き換えます。

[注記]

本章のサンプルコードはGitHubリポジトリ(https://github.com/lizrice/learning-ebpf)のchapter6ディレクトリからダウンロードできます。

本章の目的は検証器の概要説明なので、検証器が行うすべてのチェックを網羅的に説明するわけではありません。BPFプログラムを書いたときによく遭遇する検証エラーについて具体例を使って紹介します。

検証器の対象はソースコードではなくeBPFバイトコードだということに注意が必要です。バイトコードの中身はコンパイラが生成します。コンパイラの最適化などのために、ソースコードとバイトコードの内容は機械的に1対1対応しているわけではありません。そのため、ソースコードから期待された検証結果が得られないこともあります。例えば検証器は到達不可能な命令があるプログラムを拒否しますが、ソースコードにこのようなコードがあっても、コンパイラは検証器による確認前にそのようなコードを最適化によって消してしまうため、到達不能な命令による検証の失敗は発生しないでしょう。 ...

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.