個々の仮想化技術の説明に入る前に,まず仮想化技術が適用できるプロセッサの要件を明確にしていこう。以下では,汎用的な仮想化の要件について述べたうえで,現在最も広く使われているx86(IA-32)アーキテクチャを例に取り上げ,問題点を明らかにする。

すべてのセンシティブ命令が特権命令であることが要件

 仮想化を実現するためにCPUアーキテクチャが満たすべき要件の研究は古く,IBM システム/360の時代から行われている。最も有名な論文としては1974年にCACM(Communications of the Association for Computing Machinery)に掲載されたGerald J. Popek氏とRobert P. Goldberg氏の“Formal Requirements for Virtualizable Third Generation Architectures”が挙げられる。この論文は,第3世代アーキテクチャ *1のDEC PDP-10で,IBM システム/360のような仮想マシン・モニターが作れない理由を述べている。対象は古いが命令セットの役割など現在でも通用する概念の要件定義があり,価値のある論文である。

 この論文ではまず,命令セットを2つの基準で分類する。一つは特権命令(Privileged Instructions)かどうか,もう一つはセンシティブ命令(Sensitive Instructions)かどうかだ。

 x86をはじめ,多くのプロセッサはOSのカーネルを動作させるためのモード(以下システム・モードと呼ぶ)とアプリケーションを動作させるためのモード(以下ユーザー・モードと呼ぶ)の2つ,もしくはそれ以上のモードを備えている。特権命令は,ユーザー・モードで実行した場合に一種の例外(トラップと呼ぶ)を発生させる命令である。トラップを発生させることで,ユーザー・モードで不正に実行されたときに検出できるようになり,ページ・テーブルの書き換えなどの危険な操作からシステムを保護することが可能となる。

 一方,センシティブ命令は,システム・リソースの状態や動作モードなどに依存する命令のこと。システム・リソースの状態を変える「制御センシティブ命令」(Control Sensitive Instructions)と,システム・リソースの状態によって動作が変わる「動作センシティブ命令」(Behavior Sensitive Instructions)の2種類がある。

 論文では,センシティブ命令の集合が特権命令の部分集合である,つまりすべてのセンシティブ命令が特権命令であるならば,第3世代アーキテクチャで仮想マシン・モニターを作成できることを示している。センシティブ命令が特権命令であれば,ユーザー・モードで実行した場合にトラップが発生してそれを検出ができる。そこで,OSをシステム・モードではなくユーザー・モードで動作させ,トラップが発生した際に仮想マシン・モニターで命令をエミュレートすることで,本来隠したいセンシティブ命令の実行を繕う(仮想化する)ことができるというわけだ。