私は x86 アーキテクチャで動作する KVM 部分に精通しているので、KVM の x86 実装でこれを説明してみてください。
x86 アーキテクチャでは、KVM は CPU の機能を利用して、ハイパーバイザーとゲスト モードを分離します。Intel 用語では、それぞれ VMX ルート モードと非ルート モードです。
VM エントリ (ハイパーバイザー -> VM) は、VMLAUNCH 命令を使用して KVM によって起動され、ゲストが必要とするすべての情報がカーネル モードの CPU の VMCS に入力されます。qemu-kvm から kvm カーネル モジュールへのシステム コールのみが呼び出されます。
VM の終了は、ゲスト OS が、物理ハードウェアへのアクセスや割り込みの発生など、その特権を超えた何かを処理しているときに発生します。その後、VM エントリが発行され、CPU は再び非ルート モードに変更され、ゲスト コードが実行されます。要約すると、VM の終了 (VM -> ハイパーバイザー) は HW によって自動的に行われ、対応する終了の理由と情報が VMCS に記録されます。次に、KVM は VMCS をチェックして、次のステップを決定します。VM→ハイパーバイザーのシステムコールはありません。
ほとんどのデバイス エミュレーションは、qemu-kvm が既存の qemu のコードを活用できるユーザー空間に基づいています。ただし、Intel VT-d などの一部のデバイス パススルー テクノロジでは、ゲストは IOMMU などを介してハードウェアに直接アクセスできます。これにより、特に高速ネットワーク デバイスでより強力なパフォーマンスを実現できます。
ソースコードを掘り下げたい場合は、最初に にある CPU 仮想化 (Intel VT-x) に注目することをお勧めしますlinux/arch/x86/kvm/vmx.c
。Intel ソフトウェア開発者ガイドにも、VT の包括的な紹介があります。