QEMU-KVM の一般的な動作原理

QEMU-KVM の一般的な動作原理

私の現在の理解:

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) プロテクションリング

QEMU-KVM の一般的な動作原理

プロセッサ上のバイナリ プログラム コードは理由があって動作しますが、最も特権のあるレベル (リング 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 チャンネルで公開されたものです @RU_Voip チャンネル参加者の XNUMX 人からの質問への回答として。

トピックを正しく理解していない場合、または追加することがあれば、コメントに書いてください。

ありがとうございます!

出所: habr.com

コメントを追加します