インテルは,「プロテクト・モード」と呼ぶアーキテクチャを採用した32ビット・プロセッサ「Intel386」を1985年に発表した。このプロテクト・モードは,発表から20年以上経過した今も,なおそのままの形で使われている。

 「Intel Virtualization Technology(VT)」は,このプロテクト・モードに,さらに新しいアーキテクチャを追加したもので,実に20年以上の歳月を経て,プロテクト・モードにメスが入れられたことになる。今後は,すべてのIAプラットフォームの利用形態を大きく変革させていく核心技術となっていくだろう。

 ここでは,プロセッサのアーキテクチャとしてのIntel VTの技術内容を,既存のソフトウエアのみによる仮想化手法と対比しながら解説する。

特権レベルで命令実行を制御

 インテルのマイクロプロセッサは,2ビットの特権レベルの概念に基づく保護機構を備えている。IA-32ではこれに基づく動作モードを「プロテクト・モード」と呼ぶ。レベル0(Ring0)は最高の特権レベルのソフトウエア,レベル3(Ring3)は最低の特権レベルのソフトウエアに割り当てられる。この特権レベルにより,(1)CPUの基本機能を制御する「特権命令」を,フォルトを起こさずに実行できるかどうかが決まる。特権命令には,例えば,OSやアプリケーションのメモリー空間を制御するグローバル・ディスクリプタ・テーブル(GDT)やローカル・ディスクリプタ・テーブル(LDT)をロードする命令,割り込みディスクリプタ・テーブル(IDT)をロードする命令などがある。

 また,(2)特権レベルは,プロセッサのページ・テーブルとセグメント・レジスタの構成に基づいて,アドレス空間に対するアクセス権限も制御する。すなわち,特権モードの低いアドレス空間のコードは,より特権レベルの高いアドレス空間のデータの参照やコードの呼び出しを,原則として行うことができない。特権レベルの遷移は,別途,特別な手続きを備えたゲートを介して行う必要がある。

 このような特権レベルの概念により,OSのカーネルを保護し,堅牢で安定した環境を提供するのがプロテクト・モードである。なお,IA-32に用意されている4段階の特権モードは,本来は図1のようなアーキテクチャを想定していた。だが,現在のソフトウエアの大半が特権レベル0とレベル3しか使用していない。この実態が,ソフトウエアによる仮想化手法の1つのポイントとなる。

図1●特権レベルの概念
図1●特権レベルの概念

フォルト・ハンドラで調停

 特権レベルの概念の下では,OSがCPUの基本機能を制御するためには,OSのコンポーネントの少なくとも一部が特権レベル0で動作している必要がある。例えば,アプリケーションのメモリー空間を定義しているローカル・ディスクリプタ・テーブルをロードするためには,LLDT命令を発行するコードの動作モードが特権レベル0であることが必要である。そして,この特権命令によって制御されるCPUの基本機能は,単独のOS用の機能しか提供されていない。従って,1つのプラットフォーム上で,複数のOSを原則として動作させることはできない。

 もっとも,特権レベル0以外で特権命令を発行できないわけではなく,発行してもフォルトが発生するだけである。その後の動作はフォルト・ハンドラの実装による。

 そこで,意図的にOSを特権レベル0以外で動作させ,特権命令の発行によって発生したフォルトを処理するフォルト・ハンドラが,複数のOSからの特権命令を調停する機能を提供すれば,複数のOSを同時に稼働させることも不可能ではなくなる。これがIA-32プラットフォーム上で,ソフトウエアによりCPUの仮想化を実現する際の基本的な仕組みの1つである。このような手法を,リングの特権解除(非特権化)と呼ぶ(図2)

図2●リングの特権解除による仮想化の実装例
図2●リングの特権解除による仮想化の実装例