第1回で解説したOSのリソース管理機能を踏まえると,仮想化を行う際に越えなければならないハードルは,「CPUの特権レベルに関連する動作」と「メモリー,I/Oの管理」ということになる。まず前者を対象とした仮想化の代表的な手法として,バイナリ・トランスレーションと,パラバーチャライゼーションがある(図2表1)。

図2●仮想化ソフトの実装方式
図2●仮想化ソフトの実装方式
大きくバイナリ・トランスレーション方式とパラバーチャライゼーション方式がある。特権モードで実行すべき命令を,ユーザー・モードで動作するように実行時に変換するのがバイナリ・トランスレーション方式。これに対し,パラバーチャライゼーション方式ではあらかじめ仮想OS自体を変更しておいて,特権モードで実行すべき命令を取り除いてしまう。

表1●仮想化の二つの実装方式
表1●仮想化の二つの実装方式

 バイナリ・トランスレーション方式は,仮想化ソフトの上で通常のOSを変更なしで稼働させる方式である。仮想OS自体は仮想化ソフトウエアの配下で動作するため,特権モード(リング0)で動作することはできない。OS自身は自分が仮想OSとして動作しているのか,通常のOSとして動作しているのか分からないので,仮想OSは通常通り特権モードのつもりで命令を発行する。何もしなければ当然命令は正しく処理されず,CPUの処理結果として例外割り込みが発生することになる。

 バイナリ・トランスレーションでは,仮想OSが発行する命令を一度仮想化ソフトウエアが受け取り,特権モード命令などを変換(トランスレート)して実行させる。仮想化ソフトウエア内では,複数の仮想OSからの命令を競合させないように処理の順番を変えたりする。

 このように,バイナリ・トランスレーション方式では,仮想OSが発行する命令のうち,問題を起こし得るものを不整合が生じないようにあらかじめ修正してから実行させる。このためバイナリ・トランスレーション方式では,「OSに特別な修正を加えずに仮想OSとして動作させることが可能」である。半面,仮想化方式としてはオーバーヘッドが大きい。

仮想OSを改造して動かす

 パラバーチャライゼーション方式の場合,大きく異なる点は特権レベルに関連する命令への対処方法である。

 パラバーチャライゼーション方式の場合も,仮想OSからの命令は必ず仮想ソフトウエアを経由して実行される。ただしCPUの特権制御における問題を仮想化ソフトウエアでの命令の修正という処理で対処しない。仮想OSの命令自体を書き換えて,例外が発生しないようにしてしまう。簡単にいえば,仮想OS用にOS自体に修正を加えるわけである。

 そのため仮想ソフトウエア上での処理は後述するI/Oに関しての仮想化と,処理命令の制御が中心となり,優先度の動的変換が発生しなくなり,バイナリ・トランスレーションと比較し処理速度は速くなる。

 一方欠点としては,OS自体に修正を加えなければならない点が挙げられる。通常OSに修正を加えるためには,OSのソースコードが必要であるため,パラバーチャライゼーションの代表的なソフトウエアであるXenなどでは,仮想OSの対象はオープンソースであるBSD,Linuxに限定されていた注1

CPUで仮想化技術を支援

 パラバーチャライゼーション方式の明らかな欠点を解消する技術が,CPUのメーカーから出てきている。インテル社の「Virtualization Technology (Intel VT)」と,AMD社の「AMD Virtualization(AMD-V)」という技術である。機能の名称などに若干の違いはあるが,基本的なコンセプトは両者とも同じである。ここからはVTを中心に説明を進める。

 VTではこれまでのx86系CPUにあったリング0~3のモードに加えて,「Virtual Machine Extensions(VMX)」と呼ばれる動作モードが導入された。VMXモードの特徴は,仮想化ソフト自体の動作モードである「VMX-root(以下rootモード)」と,仮想OSが稼働するモードである「VMX non-root(以下 non-rootモード)」に分かれている点である。このnon-rootモードの中で,これまで通りリング0~3の特権レベルが設けられている(図3)。つまり,non-rootモードのなかで特権命令を実行できるということである。仮想マシンはrootモードとnon-rootモードを切り替えながら実行する。

図3●インテルの仮想化技術
図3●インテルの仮想化技術
仮想化ソフトと,仮想OS用の動作モードを備える。このモードでは,リング0の命令を仮想OSが実行しようとしても,例外が発生しない。代わりに仮想化ソフトに処理の依頼が発生し,そこで特権命令の処理が可能になる。

 rootモードはほぼ通常の動作モードと同じである。まず仮想化ソフトが起動すると,rootモードに入る。仮想化ソフトは処理のモードをnon-rootに切り替え,仮想OSを起動する。この処理をVM Entryと呼ぶ。仮想OSはnon-rootモードの中でリング0で動作する。このためOS自体の修正は必要ない。

 仮想OSが特権命令を発行したら,モード自体をrootに切り替える(この処理をVM Exitと呼ぶ)。仮想化ソフトでその命令に対応する処理を実行し,完了した時点で再びnon-rootモードに切り替える。これが命令の変換を不要にする仕組みである。

 VTはもう一つ,切り替えたモードごとの状態を保持するための仕組みも提供している。複数の仮想OSに対して,仮想OSごとに定義する「VMCS(Virtual Machine Control Structure)」に仮想マシンの状態を保存する。これにより,仮想OSの動作状態やアドレス空間の情報,処理の状態を特定の領域に保存しておき,仮想化ソフトウエアはその情報を確認し処理の制御できるようになっている。

 これらの機能を利用することにより,これまでの方式のように特権処理に対しての取り扱いをソフトウエアでのみ対応するのではなく,CPUが一部の処理を請け負うため通常のOSをそのまま流用でき,かつ処理スピードが上がるというメリットが得られるようになった。

金子 仁(かねこ ひとし) 日本総研ソリューションズ
2000年日本総合研究所入社。Web,ICカード・アプリケーションの開発に従事。現在は日本総研ソリューションズ 技術本部 テクノロジーセンターにおいて,システム基盤の技術支援を担当している。