私の現在の理解:
1) KVM
KVM (カーネルベースの仮想マシン) は、Linux OS 上でモジュールとして実行されるハイパーバイザー (VMM – 仮想マシン マネージャー) です。 ハイパーバイザーは、存在しない (仮想) 環境で一部のソフトウェアを実行し、同時にこのソフトウェアが実行される実際の物理ハードウェアをこのソフトウェアから隠すために必要です。 ハイパーバイザーは、物理ハードウェア (ホスト) と仮想 OS (ゲスト) の間の「スペーサー」として機能します。
KVM は Linux カーネルの標準モジュールであるため、カーネルから必要な機能 (メモリ管理、スケジューラなど) をすべて受け取ります。 したがって、最終的には、これらの利点はすべてゲストにもたらされます (ゲストは Linux OS カーネル上またはその中で実行されるハイパーバイザーで動作するため)。
KVM は非常に高速ですが、それだけでは仮想 OS を実行するには不十分です。 これには I/O エミュレーションが必要です。 I/O (CPU、ディスク、ネットワーク、ビデオ、PCI、USB、シリアル ポートなど) の場合、KVM は QEMU を使用します。
2) QEMU
QEMU (クイック エミュレータ) は、あるアーキテクチャ向けに設計されたオペレーティング システムを別のアーキテクチャ (たとえば、ARM -> x86) で実行できるようにするさまざまなデバイス用のエミュレータです。 QEMU は、プロセッサーに加えて、ネットワーク カード、HDD、ビデオ カード、PCI、USB などのさまざまな周辺デバイスをエミュレートします。
次のように機能します。
命令/バイナリ コード (ARM など) は、TCG (Tiny Code Generator) コンバータを使用してプラットフォームに依存しない中間コードに変換され、その後、このプラットフォームに依存しないバイナリ コードがターゲットの命令/コード (x86 など) に変換されます。
ARM –> 中間コード –> x86
基本的に、Intel VT-x (Intel Virtualization Technology) / AMD SVM (AMD Secure Virtual Machine) をサポートしていない古いプロセッサ モデルであっても、任意のホスト上の QEMU で仮想マシンを実行できます。 ただし、この場合、TCG (TCG はジャストインタイム コンパイラ) を使用して、実行中のバイナリ コードをオンザフライで XNUMX 回再コンパイルする必要があるため、動作が非常に遅くなります。
それらの。 QEMU 自体は非常に優れていますが、動作が非常に遅いです。
3) プロテクションリング
プロセッサ上のバイナリ プログラム コードは理由があって動作しますが、最も特権のあるレベル (リング 0) から、最も制限され、規制され、「しっかりと締められた状態」に至るまで、さまざまなレベルのデータ アクセスを持つさまざまなレベル (リング/保護リング) に配置されています。 」(リング3)。
オペレーティング システム (OS カーネル) はリング 0 (カーネル モード) 上で実行され、あらゆるデータとデバイスに対して必要な操作を行うことができます。 ユーザー アプリケーションはリング 3 レベル (ユーザー モード) で動作し、やりたいことを何でも行うことはできませんが、特定の操作を実行するたびにアクセスを要求する必要があります (したがって、ユーザー アプリケーションは自分のデータにのみアクセスでき、「データを取得」することはできません)他の人のサンドボックスに)。 リング 1 と 2 はドライバーによる使用を目的としています。
Intel VT-x / AMD SVM が発明される前は、ハイパーバイザーはリング 0 で実行され、ゲストはリング 1 で実行されました。リング 1 には OS の通常の動作に十分な権限がないため、ゲスト システムからの特権呼び出しごとに、ハイパーバイザーは、この呼び出しをオンザフライで変更し、リング 0 で実行する必要がありました (QEMU と同様)。 それらの。 ゲストバイナリ NOT プロセッサ上で直接実行され、そのたびに実行中にいくつかの中間修正が行われました。
オーバーヘッドが大きく、これが大きな問題であったため、プロセッサ メーカーはそれぞれ独立して、ゲスト OS コードの実行を可能にする拡張命令セット (Intel VT-x / AMD SVM) をリリースしました。 直接 ホストプロセッサ上で実行されます(以前の場合のように、コストのかかる中間ステップをバイパスします)。
Intel VT-x / AMD SVM の出現により、特別な新しいリング レベル -1 (マイナス 0) が作成されました。 そして、ハイパーバイザーがその上で実行され、ゲストがリング XNUMX 上で実行され、CPU への特権アクセスが得られます。
それらの。 最終的に:
- ホストはリング 0 で実行されます
- ゲストはリング 0 に取り組んでいます
- ハイパーバイザーはリング -1 で実行されます
4) QEMU-KVM
KVM はゲストに Ring 0 へのアクセスを提供し、QEMU を使用して I/O (ゲストが「見て」操作するプロセッサ、ディスク、ネットワーク、ビデオ、PCI、USB、シリアル ポートなど) をエミュレートします。
したがって、QEMU-KVM (または KVM-QEMU) :)
CREDITS
PS この記事のテキストはもともと Telegram チャンネルで公開されたものです
トピックを正しく理解していない場合、または追加することがあれば、コメントに書いてください。
ありがとうございます!
出所: habr.com