CPUの仮想化
ソフトウエアによる仮想化の実現
OSは通常、コンピュータのすべてのハードウエアとリソースを占有して動作することを前提としています。このため、本来1台のシステムでは1つのOSしか動かすことができません。
しかし、システムの仮想化技術を使えば、1台のコンピュータを複数の仮想マシンとして論理的に分割し、それぞれの仮想マシンの上で別々のOS(ゲストOSと呼びます)を独立して動作させることができます。こうした仮想化はVMWareやVirtual PCあるいはオープンソースのXenなどの仮想化ソフトウエアによって実現されてきました。これらのソフトウエアはゲストOSを制御する「VMM」(Virtual Machine Monitor)という機能を持っています。
VMMは「バイナリートランスレーション」や「パラバーチャライゼーション」といった技術によって仮想化を実現しています。CPUの仮想化に入る前に、ソフトウエアの仮想化技術について、簡単におさらいしておきましょう。
まずバイナリートランスレーションについて見ていきましょう。前項で説明したようにCPUには0から3までの4つのレベルがあります。OSは特権レベルが一番上のリング0で、アプリケーションはリング3で動作します。
バイナリートランスレーションでは、図2に示すようにVMMはリング0で動きます。そしてその上のゲストOSをリング1で稼働させます。しかし、このゲストOS自身は、自分が実行できる命令などが少ないリング1にいることを知りません。
そこでOSはリング1で実行できない命令を発行します。すると例外(フォールト)が起こり、「割り込み」と呼ばれる処理が発生します。VMMはこの割り込みをすべて監視しています。そしてこの割り込み処理でゲストOSがやりたかったこと、例えばハードウエアへのアクセス、特権命令の実行などをゲストOSの代わりに実行します。
バイナリートランスレーションとは、文字通りバイナリー(二進数命令)のトランスレーション(翻訳)です。言葉で言えば簡単ですが、実際はOSが出すすべての特権命令について、翻訳するのは非常に高度な技術が必要です。またこの処理がオーバーヘッドとなる可能性もあります。VMWareなどの市販のVMMソフトウエアなどは、できるだけこのオーバーヘッドが少なくなるように、多くの技術者が開発にあたっています。
もう1つのソフトウエアによる仮想化技術が、パラバーチャライゼーション(準仮想化)です。オープンソースのXenがこの技術を採用しています。パラバーチャライゼーションではVMMがリング0で、ゲストOSが1あるいは2で動作します。
パラバーチャライゼーションでは、ゲストOSのコードを変更し、リング0でしかできない命令をVMMにわたすようにしています。つまり、バイナリートランスレーションとは異なり、ゲストOS自体が特権レベルの低い所にいるということを認識し、特権レベルに限られた処理をVMMに任せているのです。
この方法であれば、バイナリートランスレーションであったようなトリッキーな処理は必要ないため、特殊な技術がなくても実現でき、またオーバーヘッドも比較的少なくて済みます。ただしOSのコードに変更を入れるため、市販のOSでは対応が難しくなります。よってXenを利用する場合は、ゲストOSはオープンソースのLinuxに制限されます。
ソフトウエアによる仮想化処理の限界
上記で説明したように、ソフトウエアで仮想化を実現する場合は、ゲストOSとホストOSの切り替え処理によるオーバーヘッドでパフォーマンスが低下したり、利用できるOSに制限があるといった問題があります。
これに対し、今回説明するCPUの仮想化技術は、よりハードウエアレベルで複数の仮想マシンを制御する処理を行うため、切り替えなどにかかるオーバーヘッドが少なく、またゲストOSの制限からも解放されます。
Intelでは「Intel Virtualization Technology」(以下、VT)と呼ばれる仮想化技術を、AMD社は「AMD-V」と呼ばれる仮想化技術をそれぞれのCPUに採用しています。
では、CPUに仮想化の機能が入った場合にはどのような動きになるのでしょうか?