shadow pagingとKVMにおける実装について-私の影を踏まないで...-
本書は、Linux KVMのshadow pagingの実装について解説します。読者の前提条件として、仮想化及びx86アーキテクチャにおけるアドレス変換機構(MMU)に関する基礎知識を有している方を対象としておりますので、あらかじめご了承ください。
コラム1
KVMについて
KVMは米国Qumranet社により開発されている仮想マシンで、完全仮想化をサポートします。当初は仮想化拡張機能(Intel VT-x、 AMD SVM)をもつx86アーキテクチャを対象に開発されてきましたが、現在ではその他のCPUアーキテクチャにも移植されています。本書内では特に記載がある部分を除き、x86アーキテクチャのみを対象といたします。
実装の特徴としては次のようなものが挙げられます。
- CPUの仮想化機能を利用しています。
- Linuxデバイスドライバとユーザ空間で実行されるプロセスのペアで実装されており、ユーザ空間ではデバイスエミュレーション等を行うことにより、カーネル内のコードを小さく保っています。ユーザ空間で動作するプロセスとゲストVMが1:1に対応しています。
- コードの再利用。Linuxデバイスドライバとして実装することにより、既にあるLinuxカーネルの機能を利用することができます。また、デバイスエミュレーションはqemuのコードを再利用しています。結果、カーネル内のコードは非常にコンパクトに実装されています。
shadow pagingとは
ゲストが物理アドレスと考えているアドレス(ゲスト物理アドレス)は、実際の物理アドレス(ホスト物理アドレス)とは違うものであり、ハイパーバイザーは、ゲストVMを動作させるためにMMUを何らかの形で仮想化する必要があります。その一手法がshadow pagingです。
一般にハイパーバイザーは、ゲスト物理アドレス → ホスト物理アドレスの変換を管理しています。そこで、ゲストが作成した仮想アドレス → ゲスト物理アドレス変換を行うpage tableを元に、ゲスト → ホスト物理アドレス変換テーブルを用いてホスト物理アドレスを指すように変換したpage tableを作成し、実CPUにはこのpage tableを用いるように設定します。
ゲストが作成したpage tableを元にアドレス変換を行ったpage tableを作成することを、shadowするといい、作成されたpage tableをshadow page tableと呼びます。ハイパーバイザーはページフォルトを捕らえ、ゲストpage tableを確かめます。ゲストpage tableエントリが正しいページをさしている場合には、shadow page tableを適切に更新してゲストの実行を再開させます。ゲストpage tableエントリがページをさしていない場合はゲストに適切な例外をinjectします。
以上がshadow pagingの基本的なアイデアです。