通常のスタンドアロンホストの場合、さまざまなプロセスがスケジューラを使用してコンテキスト切り替えを行います。たとえば、プロセス1とプロセス2があるとすると、制御はプロセス1からスケジューラに移り、次にスケジューラからプロセス2に移り、別のプロセスをスケジュールするためにスケジューラに制御を戻すまで実行されます。
プロセス1からプロセス2へのこの切り替えがVMでどのように行われるのか知りたいですか? VMはVM内の2つのプロセス間にプロセススイッチがあるたびにVM_EXIT()
を呼び出しますか?またはホストスケジューラはプロセススイッチと関係がありますか?
AFAIK、ホストOSはVMを単一のプロセスと見なします。これらの疑問を解決できるヒントを誰かに指摘してもらえますか?
仮想マシンは内部で何が起こっているのかを理解しておらず、ハードウェアをシミュレートしているだけです。
VMシミュレーションの3つの基本的な方法があります。最も明白な方法は、Bochsが行うハードウェアエミュレーションです。これは、x86互換PCをプログラムでシミュレートするだけで、背後に深い魔法はありません。PCはデータを処理するためのマシンであるため、BochsはホストOSを使用して入力データを収集し、それをエミュレートされた仮想デバイスにフィードし、それらのデバイスから出力データを読み取り、Hostを使用してそれを提示します。これはまさにコンソールエミュレーターや同様のプログラムが行うことです。Bochs VM内で何が起こっているのかわからないため、エミュレートされたベアハードウェアで動作します。プロセスの概念は抽象的すぎて、そのようなことを気にする必要はありません。ハードウェアエミュレーションだけです。
2番目の種類のVMは、ハードウェアアクセラレーションによる仮想化が導入される前に一般的でした。マシンコードをバイトごとに解釈するため、Bochsスタイルのエミュレーションは低速です。実行中のOSではベアバイトコードを実行することはできません。 CPUの動作方法が原因で(そして正当な理由でそのように動作します)、アプリケーションはバイトコードのチャンクを取得して編集し、ホストOSで安全に実行できるようにしてから、独自のコードとして実行できます。編集段階には2つの目的があります。コードをサニタイズして実行を可能にすることと、シミュレートされたI/Oデバイスをホストの適切なデータソース/ターゲットに接続することです。それでも、VMにはプロセスのようなものはなく、物理上のコードを疑似エミュレートするだけです。 CPU、それがプログラムのコードであるふりをします。
最後に、3番目の種類のVMは、ハードウェアアクセラレーションによる仮想化VMです。ハードウェアでのサポートが必要ですが、最近のすべてのCPUでサポートされています。これは、以前は不可能だと言ったことを実行することです。つまり、ホストOSと並行して低レベルのコードを実行します。重要なのは、CPUに組み込まれている場合は、コードを適切に処理できるようにすることです。そのコードのサンドボックス環境を作成し、ホストがそのサンドボックスを制御できるようにします。このように、VMコードはハードウェアの近くで実行されるため、動作が速くなります。ハードウェアリングシステムの使用にも近くなりますが、プロセスの正確な概念は導入されません。これらはは常にゲストOSによって処理されますが、ハードウェアで高速化されたVMでは、ホストのようなコンテキスト切り替えに似たものを実際に見ることができます。他の種類のVMは常にユーザーレベルのプログラムとして実行されます。
VM内でのプロセス切り替えは、通常のマシンで行われるのと同じ方法で行われます。OSは、作業中のプロセスを変更するだけです。ホストは、内部で何が起こっているかを認識または気にしません。 VM-どのような違いがありますか?