少し読んだ後、次の場所で説明されている特定のレベルの理解に達しました。
https://stackoverflow.com/a/13045437/1163200
ここで完全に再現します:
これは私自身の質問に答えようとする試みです。
システム仮想化 : IO 仮想化とハイパーバイザーの役割を理解する
仮想化
概念としての仮想化により、複数の/多様なアプリケーションが、互いに意識することなく、同じ基盤となるハードウェア上で共存できます。
たとえば、Windows、Linux、Symbian などの本格的なオペレーティング システムとそれらのアプリケーションを同じプラットフォームに共存させることができます。すべてのコンピューティング リソースが仮想化されます。
これは、前述のどのマシンも物理リソースにアクセスできないことを意味します。物理リソースにアクセスできる唯一のエンティティは、仮想マシン モニター (別名ハイパーバイザー) と呼ばれるプログラムです。
今、これは重要です。よく読んでから読み直してください。
ハイパーバイザーは、上記の各マシンに仮想化環境を提供します。これらのマシンは物理ハードウェアではなく仮想化されたハードウェアにアクセスするため、仮想マシンとして知られています。
例として、Windows カーネルが物理タイマー (システム リソース) を開始する場合があります。タイマーがメモリ マップド IO であるとします。Windows カーネルは、タイマー アドレスに対して一連のロード/ストア命令を発行します。仮想化されていない環境では、これらのロード/ストアにより、タイマー ハードウェアのプログラミングが発生します。
ただし、仮想化環境では、これらのロード/ストア ベースの物理リソースへのアクセスにより、トラップ/障害が発生します。トラップはハイパーバイザーによって処理されます。ハイパーバイザーは、ウィンドウがタイマーをプログラムしようとしたことを認識しています。ハイパーバイザーは、各仮想マシンのタイマー データ構造を維持します。この場合、ハイパーバイザーは、Windows 用に作成したタイマー データ構造を更新します。次に、リアル タイマーをプログラムします。タイマーによって生成された割り込みは、最初にハイパーバイザーによって処理されます。仮想マシンのデータ構造が更新され、仮想マシンの割り込みサービス ルーチンが呼び出されます。
簡単に言うと、Windows は、非仮想化環境で行うであろうすべてのことを行いました。この場合、そのアクションにより、実際のシステム リソースが更新されるのではなく、仮想リソース (上記のデータ構造) が更新されます。
したがって、すべての仮想マシンは、基盤となるハードウェアにアクセスしていると認識します。実際には彼らには知られていませんが、物理ハードウェアへのすべてのアクセスはハイパーバイザーによって仲介されています。
上記のすべては、完全な/従来の仮想化です。最新の CPU のほとんどは、従来の仮想化には適していません。トラップ/フォルトは、すべての命令に適用されるわけではありません。そのため、ハイパーバイザーは最新のデバイスでは簡単にバイパスされます。
ここで、準仮想化が登場します。仮想マシンのソース コード内の重要な指示は、ハイパーバイザーの呼び出しに置き換えられます。上記のロード/ストア スニペットは、次のような呼び出しに置き換えることができます。
Hypervisor_Service(Timer Start, Windows, 10ms);
エミュレーション
エミュレーションは、仮想化に関連するトピックです。もともと ARM 用にコンパイルされたプログラムを ATMEL CPU で実行するシナリオを想像してみてください。ATMEL CPU は、各 ARM 命令を解釈し、ATMEL プラットフォームで必要なアクションをエミュレートするエミュレータ プログラムを実行します。したがって、エミュレーターは仮想化環境を提供します。
この場合、システム リソースの仮想化は、トラップおよび実行モデルを介して実行されません。