私はKVM
とQemu
についてしばらく読んでいます。現在、私は彼らが何をしているのかを明確に理解しています。
KVMはハードウェア仮想化をサポートし、ゲストオペレーティングシステムにネイティブに近いパフォーマンスを提供します。一方、QEmuはターゲットオペレーティングシステムをエミュレートします。
私が混乱しているのは、この2つの座標のレベルです。お気に入り
Qem:
QEmuは完全なスタンドアロンソフトウェアです。マシンをエミュレートするために使用します。非常に柔軟で移植性があります。主に、特定のプロセッサ用に記述されたバイナリコードを別のプロセッサに変換する(たとえば、PPC macまたはx86のARMでMIPSコードを実行する)特別な「リコンパイラ」によって機能します。 PC)。
Qemuには、プロセッサだけでなく、ディスク、ネットワーク、VGA、PCI、USB、シリアル/パラレルポートなどの周辺エミュレータの長いリストが含まれています。
KQem:
ソースとターゲットの両方が同じアーキテクチャである特定のケースでは(x86上のx86の一般的なケースのように)、コードを解析して「特権命令」を削除し、コンテキストスイッチに置き換える必要があります。 x86 Linuxで可能な限り効率的にするために、これを処理するKQemuと呼ばれるカーネルモジュールがあります。
カーネルモジュールであるため、KQemuはほとんどのコードを変更せずに実行でき、最低レベルのring0のみの命令のみを置き換えます。その場合でも、ユーザー空間QemuはエミュレートされたマシンにすべてのRAMを割り当て、コードをロードします。違いは、コードを再コンパイルする代わりに、KQemuを呼び出してスキャン/パッチ/実行することです。すべての周辺ハードウェアエミュレーションはQemuで行われます。
ほとんどのコードは変更されていないため、これはプレーンなQemuよりもはるかに高速ですが、ring0コード(VMのカーネル内のほとんどのコード)を変換する必要があるため、パフォーマンスが低下します。
[〜#〜] kvm [〜#〜]:
KVMは2つあります。1つ目は、プロセッサーを新しい「ゲスト」状態に切り替えるLinuxカーネルモジュール(現在はメインラインに含まれています)です。ゲスト状態には独自のリング状態のセットがありますが、特権ring0命令はハイパーバイザーコードにフォールバックします。これは新しい実行モードのプロセッサであるため、コードを変更する必要はありません。
カーネルモジュールは、プロセッサの状態の切り替えとは別に、MMUレジスタ(VMの処理に使用)のようなエミュレーションのいくつかの低レベルの部分と、PCIエミュレートされたハードウェアの一部を処理します。
次に、KVMはQemu実行可能ファイルのフォークです。両方のチームは、違いを最小限に抑えるために積極的に取り組んでおり、その削減には進歩があります。結局のところ、Qemuがどこでも機能することが目標であり、KVMカーネルモジュールが利用可能な場合は、それが自動的に使用される可能性があります。しかし、近い将来、Qemuチームはハードウェアエミュレーションと移植性に重点を置き、KVMの人々はカーネルモジュールに重点を置き(パフォーマンスを向上させる場合は、エミュレーションの小さな部分を移動することもあります)、ユーザースペースコードの残りの部分。
Kvm-qemu実行可能ファイルは、通常のQemuのように機能します。RAMを割り当て、コードをロードし、それを再コンパイルしたり、KQemuを呼び出したりする代わりに、スレッドを生成します(これは重要です)。スレッドはKVMカーネルモジュールを呼び出してゲストモードに切り替え、VMコードの実行に進みます。特権命令では、KVMカーネルモジュールに戻り、必要に応じて、Qemuスレッドに信号を送り、ほとんどのハードウェアエミュレーションを処理します。
このアーキテクチャの良い点の1つは、ゲストコードが通常のLinuxツールで管理できるposixスレッドでエミュレートされることです。 2コアまたは4コアのVMが必要な場合、kvm-qemuは2または4スレッドを作成し、それぞれがKVMカーネルモジュールを呼び出して実行を開始します。同時実行性(実際のコアが十分にある場合)、またはスケジューリング(そうでない場合)は、通常のLinuxスケジューラーによって管理され、コードを小さく保ち、予期せぬ事態を最小限に抑えます。
KVM=はCPUとメモリへのアクセスを調停し、QEMUはハードウェアリソース(ハードディスク、ビデオ、USBなど)をエミュレートします。単独で作業する場合、QEMUはCPUとハードウェアの両方をエミュレートします。 。