質問: ### 疑問 ホストOS型仮想化ソフト内でハードウェアを使用するとき、 ゲストOSから直接実ハードウェアを制御することを禁止(一度仮想化ソフト、ホストOSを介させる)するためゲストOSがハードウェアを使用しようとする度に例外を投げさせ、 それを仮想化ソフトウェアがキャッチして通常の手順、つまり一度ホストOSを介してハードウェアを制御する、 と理解しています。 ですが、これだとゲストOSは結局ハードウェアを使用できていないことになる気がします。 そうなると、どうして仮想マシンは通常通り稼働するのでしょうか? ゲストOSはハードウェアが使用できないと例外を投げるのに、どうして通常通りOS以上のソフトウェアを稼働させられるのでしょうか? そもそも認識が違うのかもしれませんが、ご回答お願いします。 一応、以下に疑問が生じた経緯を書いておきます。 ### 疑問が生じた経緯 仮想サーバ構築に関するとあるeラーニングを受けていた(有料講座であるため内容へのリンクなどは貼れませんが)ところ、ホストOS型仮想化ソフトウェアの仮想マシンが実ハードウェアを使用するときは、以下のような処理がなされていると説明されていました。 * まず、ソフトウェアがCPUなどのハードウェアを使うときは、OSを介して使用されている * OSはソフトウェアからの要求を受け、OSの特別権限でハードウェアを使用する(命令を下す) * このため、ゲストOSはホストOSを介さずに特別権限で実ハードウェアを直接制御できてしまう * 当然それは問題になるため、仮想化ソフトウェアは、ゲストOSのハードウェア使用要求を禁止する * するとゲストOSはハードウェアを使用しようとする度に例外を投げ、それを仮想化ソフトウェアがキャッチしてホストOSにハードウェア使用要求を投げる * 以上により、ゲストOSが直接実ハードウェアを制御することはなく、通常通りホストOSを介してきちんとした手順でハードウェアを使用できる これについて、ゲストOSに直接ハードウェアを制御させないため、ゲストOSからのハードウェア使用命令を禁止して例外を投げさせ、それをもとに仮想化ソフトウェアがホストOSにハードウェア使用要求を送る、という理解でいるのですが、そうなると疑問が生じました。 ### 生じた疑問 まず、ゲストOSはハードウェアを使用しようとしても仮想化ソフトウェアにより禁止されているため例外を投げるのであれば、ゲストOSは「CPUも使えないんじゃソフトウェアに計算結果を返せないな」という状態になっているのではないでしょうか? すると、結局仮想マシンは一向に処理が進まず...ということになってしまう気がします。 そのあたり、何かここに書いてある以外の仕組みが働いているのでしょうか? もしくは、僕の認識がそもそも違っているのでしょうか?
回答: 「疑問が生じた経緯」に書かれている理解は概ね合っています。 > > ゲストOSは「CPUも使えないんじゃソフトウェアに計算結果を返せないな」という状態になっているのではないでしょうか? > > > 仮想マシンには、仮想CPUと仮想のメモリ(仮想記憶の意味での仮想じゃなくてVM的な意味での仮想)がありますので、その上でプログラムが稼働することは可能です。 CPUの一般命令が、物理メモリ割り当て済のメモリ上で動く分には、そのまま物理CPUと物理メモリで動きます。 I/O等の特権命令実行時や、物理メモリ割り当て範囲外へのメモリアクセスがあった時点で、VMモニタが介入して、仮想OSに見えないところで、まるでその命令実行が成功したかのごとく取り繕います。