Paravirt_ops
Linux は、さまざまなハイパーバイザの仮想化技術をサポートしている。 これまでは、ハイパーバイザごとに別のバイナリカーネルが必要だったが、 pv_ops によってこの制約はなくなった。 Linux pv_ops は、さまざまなハイパーバイザをサポートするための仮想化 API である。 各ハイパーバイザが重要な操作を上書きできるようにし、ネイティブマシン (ハイパーバイザがまったくない環境)を含め、サポート対象のすべての 実行環境で 1 つのカーネルバイナリを動かせるようにする。
pv_ops は、低レベルの重要な命令と、さまざまな領域の高レベルな機能に対応する 操作を表す関数ポインタの集合を提供する。pv_ops では、起動時に低レベルの 重要操作をバイナリパッチすることで、実行時の最適化ができる。
pv_ops の操作は次の 3 つのカテゴリに分けられる。
- 単純な間接呼び出し
間接呼び出しのオーバーヘッドがそれほど重要でないと分かっている 高レベルの機能に対応する操作である。
- バイナリパッチで最適化できる間接呼び出し
通常は低レベルの重要な命令に対応する操作である。頻繁に呼び出され、 性能上重要になる。オーバーヘッドが非常に重要となる。
- 手書きのアセンブリコード用のマクロの集合
手書きのアセンブリコード(.S ファイル)にも準仮想化が必要である。 センシティブ命令を含んでいたり、一部のコードパスが性能上非常に 重要だったりするためである。