元々、ゲストOSを制御する方法がなかったため、ゲストOSに実際のハードウェアを使用させることはできませんでした。実際のCPUで実行しようとした場合、ホストOSに制御を戻す保証はありません。
説明したとおりの仮想化は、特定のルールと制限をホストOSで管理できるハードウェアレベルで適用できるようにすることで、ハードウェアに実装されます。これにより、ホストOSはゲストができることとできないことに関するルールを設定し、実際のハードウェアでゲストを実際に実行できます。ゲストがルールに違反する実際のハードウェアで何かを実行しようとすると(ディスクデバイスへのアクセスなど)、ハードウェアはゲストを一時停止し、ホストに割り込みを送信します。エミュレートされたディスクデバイスからデータを返す)、ゲストを再開します。
プロセスの簡単な例を次に示します。
ホストOS:ちょっとCPU、仮想化されたこのコードを実行する必要があります。命令を実行するだけではない何かをしたい場合は私に電話してください。
ホストCPU:わかりました!
ホストCPUはすべてのホストレジスタと状態を保存し、ゲストOSコードの実行を開始します
ゲストOS:私は生きています!ちょっとCPU、このファイルを入手できますか?
ホストCPU:ええと...確かに。一瞬。
ホストCPUはすべてのゲストレジスタと状態を保存してから、すべてのホストレジスタと状態を復元します
ホストCPU:ホストOSよ、ゲストはこのファイルを望んでいた!
ホストOS:ああ、よくこれを与えてください:仮想ハードドライブからのファイル
ホストCPU:わかりました!
ホストCPUはすべてのホストレジスタと状態を保存し、ゲストレジスタと状態を復元してから、ゲストOSコードの実行を開始します
ホストCPU:ここにそのファイルがあります!
ゲストOS:甘い、ありがとう!
ここでの主な違いはエミュレーターにあり、ゲストOSは実際にハードウェア上で実行されることはありません。仮想化では、ホストOSがCPUに制限を設定し、実際に物理CPUでゲストコードを実行します。上記の例は非常に単純化されていますが、メモリ、ディスクI / O、さらにはネットワークを最新のプロセッサで制御できるため、毎回ホストOSを煩わせることなく安全にインターフェイスできます。ゲストが仮想化された境界の外に出ようとしない限り、特定の時点で何もすることがない場合、ホストOSでコードが実行されない場合があります。
少し視点を加えると、これは仮想化と制御の長い歴史のもう1つのステップにすぎません。(これが正しい順序であるか、網羅的であるという保証はありませんが、適切な開始概要を提供する必要があります)
当初、仮想化はありませんでした。プロセスはすべて同じメモリ空間を共有し、すべてがハードウェアへのフルアクセスを持ち、マルチタスク機能は、1つのプロセスが停止して次のプロセスに制御を与えることに完全に依存していました。OSがプロセスをコントロールの任意の並べ替えを持っていると思った場合は、それが持っていた(それはあまりにも痛々しいほど遅かったので、誰もが、なかった)エミュレータでプロセスを実行します。
最初は特権メモリでした。メモリの特別な領域でのみ実行できる特定のアクションです。これらの領域はOSによって占有されており、これらの特権アクションへのゲートウェイとして機能することができます。例としては、データをハードウェアに読み書きする機能があります。これにより、プロセスがハードドライブに対して直接読み取り/書き込みを行うことを防ぎ、代わりにOSに読み取り/書き込みを要求するように強制します。これは、OSがアクションを実行する前にプロセスに許可があるかどうかを確認できることを意味します。
次に、仮想化された「時間」がありました。OSは、設定された間隔でアクティブなプロセスを中断するようにCPUを構成し、スケジューリングを制御してプロセスを切り替えることができます。OSは、ハードウェア上でプロセスを直接実行できるようになりましたが、それでも CPU時間の誤用を防ぎます。これはハードウェアタイマーによって提供されました。
次に仮想メモリが登場しました。共有メモリの問題は、どのプロセスでも他のプロセスのメモリを読み取ることができるということです。MaryのプログラムがBobのパスワードをWebブラウザーから読み取るとどうなりますか?仮想メモリを使用すると、OSはプロセスが認識するメモリを物理メモリのさまざまな部分にマップしたり、物理メモリから完全に(ページファイルに)移動したりすることもできます。プロセスがメモリの読み取りまたは書き込みを試みるたびに、CPUのVMMU(仮想メモリ管理ユニット)は、物理メモリ内でマップされている場所を検索し、そこでアクションを実行します。メモリ外にマップされている場合、CPUはページファイルからメモリにページをフェッチするためにOSを呼び出します。
さて、この時点で、プロセスを安全に実行し、OSが特に許可していない限り、システムを引き継ぐことを積極的に防ぐことができるX86プロセッサの始まりについて到達しました。この時点で、プロセスは事実上「仮想化」されています。このサポートは長い間使用されてきたため、すべてのプロセスが現在仮想化されていると想定されているため、仮想化プロセスについて人々が話しているのを実際に聞くことはありません。
しかし、仮想化OSが特別なのはなぜですか?プロセスとして起動するだけで、独自の処理を実行できないのはなぜですか?問題は、OSとして、ゲストシステムがホストがプロセスを制御するために使用するものと同じコントロールにアクセスして使用できることを期待していることです。基本的に、OSはコンピューターの最高の支配者であり、そうでない場合は動作しません。「ハードウェア仮想化」拡張機能(AMDの場合はAMD-V、Intelの場合はVT-x)を使用すると、ホストOS は仮想プロセスコントロール(仮想特権メモリ、仮想ハードウェアタイマー、仮想仮想メモリ)の仮想化セットを提供できます。