Paravirt_ops

Linux は、さまざまなハイパーバイザの仮想化技術をサポートしている。 これまでは、ハイパーバイザごとに別のバイナリカーネルが必要だったが、 pv_ops によってこの制約はなくなった。 Linux pv_ops は、さまざまなハイパーバイザをサポートするための仮想化 API である。 各ハイパーバイザが重要な操作を上書きできるようにし、ネイティブマシン (ハイパーバイザがまったくない環境)を含め、サポート対象のすべての 実行環境で 1 つのカーネルバイナリを動かせるようにする。

pv_ops は、低レベルの重要な命令と、さまざまな領域の高レベルな機能に対応する 操作を表す関数ポインタの集合を提供する。pv_ops では、起動時に低レベルの 重要操作をバイナリパッチすることで、実行時の最適化ができる。

pv_ops の操作は次の 3 つのカテゴリに分けられる。

  • 単純な間接呼び出し

    間接呼び出しのオーバーヘッドがそれほど重要でないと分かっている 高レベルの機能に対応する操作である。

  • バイナリパッチで最適化できる間接呼び出し

    通常は低レベルの重要な命令に対応する操作である。頻繁に呼び出され、 性能上重要になる。オーバーヘッドが非常に重要となる。

  • 手書きのアセンブリコード用のマクロの集合

    手書きのアセンブリコード(.S ファイル)にも準仮想化が必要である。 センシティブ命令を含んでいたり、一部のコードパスが性能上非常に 重要だったりするためである。