x86アーキテクチャは1台のコンピュータで複数のOSを同時に稼働させるようには設計されていない。複数のOSを同時に稼働させるには,ハードウエアとOSの間に,仮想化を実現する「仮想マシン・モニター(Virtual Machine Monitor:VMM)」と呼ぶソフトウエアを稼働させる必要がある。VMware製品やMicrosoftの「Virtual Server」,XenSourceの「Xen」などの代表的なVMMが,どのようにして複数OSの同時稼働を実現しているのか見ていこう。

 x86アーキテクチャの世界でも「仮想化」が注目されている。仮想化と一言で言っても,1台のコンピュータ上で複数の処理を実現するCPUの仮想化,ストレージの仮想化,ネットワークの仮想化など,様々な種類の技術があり,1台のコンピュータを仮想化によって分割するテクノロジは,約40年にもおよぶ歴史がある。x86アーキテクチャで現在注目されているのは,特にCPUの仮想化だ。

 CPUの仮想化を利用すると,1つのコンピュータ上で複数のOSを同時に稼働できる。同様な仕組みに「エミュレータ」があるが,仮想化はエミュレータとは異なる。

 エミュレータは,あるハードウエアのふりをするソフトウエア。エミュレータ上で稼働するソフトウエアが発行する機械語命令やハードウエア・アクセスを,CPUなど実際のハードウエアに代わって,エミュレータが処理する。そのため,例えばWindowsマシン上でPowerPC用OSやARM用OSを動かせるが,その処理性能は実機に比べて著しく低下する。

 それに対して仮想化技術では,その上で稼働するソフトウエアは,実機のCPUによって処理される。そのため,動かせるのは実機のCPUに対応したOSのみだが,実機に近い処理性能が出る。しかし,x86アーキテクチャは,1台のコンピュータで複数のOSを同時に稼働させるようには設計されていない。そのため,複数のOSを稼働させる仕組み(ソフトウエア)が必要である。ハードウエアとOSの間に,仮想化を実現する「仮想マシン・モニター(Virtual Machine Monitor:VMM)」と呼ぶソフトウエアを稼働させる。

 VMware製品やMicrosoftの「Virtual Server」,XenSourceの「Xen」といった「仮想化ソフトウエア」がVMMに当たる。それぞれ独自の仕組みによって,x86アーキテクチャ上で複数のOSを同時稼働させている。x86アーキテクチャで仮想化を実現する技術/ソフトウエアはほかにもあるが,ここでは代表的な上記製品を主に取り上げる。

 VMMの実装は,次のように分類できる。
(1)フル・バーチャライゼーション(バイナリ・トランスレーション)とパラバーチャライゼーション
(2)ホスト・ベースとハイパーバイザ
(3)純ソフトウエア・ベースとハードウエア・サポート

 それぞれ順に説明しよう。

通常のOSをそのまま仮想環境で稼働

 フル・バーチャライゼーションとは,ハードウエア上で直接動作することを前提に作られている一般のOSを,そのまま改変せずに,VMM上で動かす仮想化方式である。コンピュータに実装したメモリー容量やCPUの処理性能にもよるが,VMM上では,異なるOSを複数同時に稼働できる。VMware製品やVirtual Serverが代表的な製品である。

 既に述べたように,x86アーキテクチャは,1つのコンピュータ上で稼働するOSは1つだけだという前提で設計された。そのため,WindowsやLinuxといったx86アーキテクチャ用のOSはハードウエア資源を独り占めし,例えばメモリーや割り込みなどを独占的に管理する。このようなOSをそのまま複数同時に稼働させることはできない。

 そこでVMware製品は,x86アーキテクチャのCPUが備えるリング機構を利用する。リング機構とは,リング0(特権レベル0)からリング3(特権レベル3)までの4段階の特権レベルを規定した保護機構で,リング0以外で動作するソフトウエアが特権命令を発行すると例外(フォルト)が発生する。その例外は,リング0のソフトウエアによって処理可能である。このとき例外を処理するルーチンを「例外ハンドラ」,特に「フォルト」を処理するルーチンを「フォルト・ハンドラ」と呼ぶ。

 例えば,CPUが備えるメモリー管理用テーブルを操作する命令は特権命令である。一般にはOSのカーネルがリング0で動作し,このような特権命令を発行する。それに対してアプリケーション・ソフトウエアはリング3で動作する。

CPUの保護機構を利用

 このようなCPUの保護機構を利用して,一般のOSをそのまま,複数同時に稼働させる仕組みをバイナリ・トランスレーションと呼ぶ。具体的には,VMMをリング0,OSをリング1で動作させ,OSが発行した特権命令をVMMのフォルト・ハンドラがキャッチし,処理する(図1)。

図1●バイナリ・トランスレーションとパラバーチャライゼーションの仕組みの違い
図1●バイナリ・トランスレーションとパラバーチャライゼーションの仕組みの違い

 ただし,これだけでは複数のOSを同時に動かせない。例えばメモリーの割り当てやハードウエア・アクセスなどを調停する必要がある。そのため,メモリーに関しては,コンピュータに実装されているメモリー(マシン・メモリー)をVMMが管理し,その一部をVMM上で動作する各OS(「ゲストOS」と呼ぶ)に割り当てる。ゲストOSは,割り当てられたメモリーが物理メモリーだと思い込んで動作する。

 実機でアプリケーションがメモリーにアクセスする場合,アプリケーションが管理している仮想アドレスは,セグメントやページングが処理され,リニア・アドレスを経て,物理アドレスに変換された上でアクセスされる。だが仮想環境では,ゲストOSがアクセスしようとしている物理アドレスは,VMMによって割り当てられたマシン・メモリーの一部である。そのため,さらに,マシン・メモリーのアドレスに変換する必要がある。この変換はVMMが担っており,仮想化でのオーバーヘッドが大きい処理の1つだ。仮想環境の処理性能低下の一因になっている。