x86仮想化とは、 x86 / x86-64 CPU上でハードウェア支援による仮想化機能を利用することです。
1990年代後半、x86仮想化は、プロセッサのハードウェア支援仮想化機能の不足を補いつつ妥当なパフォーマンスを達成するために必要な複雑なソフトウェア技術によって実現されました。2005年と2006年には、Intel(VT-x)とAMD(AMD-V)の両方が、よりシンプルな仮想化ソフトウェアを可能にする限定的なハードウェア仮想化サポートを導入しましたが、速度面でのメリットはほとんどありませんでした。[ 1 ]大幅な速度向上を可能にするより高度なハードウェアサポートは、後のプロセッサモデルで実現しました。
以下の議論は、x86アーキテクチャの保護モードの仮想化のみに焦点を当てています。
保護モードでは、オペレーティングシステムカーネルはカーネル空間で最も特権の高いレベル(リング0)で実行され、 MMUの設定、物理メモリの管理、I/O周辺機器の直接制御を行うことができます。一方、アプリケーションはユーザー空間でより低い特権レベル(リング3など)で実行され、独自の仮想アドレス空間に限定され、カーネルからI/O操作やその他の特権サービスを要求するにはシステムコールを呼び出す必要があります。
ソフトウェアベースの仮想化では、ホストOSはハードウェアに直接アクセスできますが、ゲストオペレーティングシステムは、ホストOSの他のユーザースペースアプリケーションと同様に、ハードウェアへのアクセスが制限されます。このメカニズムを実装するためにx86ソフトウェアベースの仮想化で使用されるアプローチの1つは、リング特権解除と呼ばれ、ゲストOSを0よりも高い(特権の低い)リングで実行することで、特権命令の実行試行をハイパーバイザが傍受して処理できるようにします。[ 2 ]
保護モードの仮想化を可能にした3つの技術:
これらの手法は、IBM System/370のようなネイティブ仮想化可能なアーキテクチャ上で動作するVMと比較して、MMU仮想化サポートの欠如により、パフォーマンス上のオーバーヘッドが発生します。[ 4 ] : 10 [ 9 ] : 17および21
従来のメインフレームでは、古典的なタイプ 1ハイパーバイザは独立しており、どのオペレーティングシステムにも依存せず、ユーザー アプリケーション自体も実行しませんでした。対照的に、最初の x86 仮想化製品はワークステーション コンピュータを対象としており、ホスト OS の下で実行されるカーネル モジュールにハイパーバイザを組み込むことで、ホスト OS 内でゲスト OS を実行しました (タイプ 2 ハイパーバイザ)。[ 8 ]
ハードウェア支援のないx86アーキテクチャが、PopekとGoldbergが述べたように仮想化可能かどうかについては、議論がある。VMwareの研究者らは、2006年のASPLOS論文で、上記の技術によって、古典的なトラップ・アンド・エミュレート技術ではないものの、PopekとGoldbergの3つの基準を満たすという意味でx86プラットフォームが仮想化可能になったと指摘した。[ 4 ]: 2-3
Denali、L4、Xenなどの他のシステムは、準仮想化と呼ばれる別の方法を採用しました。これは、仮想化が難しい実際のx86命令セットの部分を実装しない仮想マシン上で動作するようにオペレーティングシステムを移植するものです。準仮想化されたI/Oは、オリジナルのSOSP '03 Xen論文で実証されているように、パフォーマンス面で大きな利点があります。 [ 10 ]
x86-64 ( AMD64 )の初期バージョンでは、ロングモードでのセグメンテーションのサポートがなかったため、ソフトウェアのみによる完全な仮想化は不可能でした。そのため、ハイパーバイザのメモリ、特にゲストカーネルのアドレス空間で実行されるトラップハンドラの保護が不可能でした。[ 11 ] [ 12 ] : 11および20リビジョンD以降の64ビットAMDプロセッサ(一般的には90nm以下で製造されたもの)では、ロングモードでのセグメンテーションの基本サポートが追加され、バイナリ変換を介して64ビットホスト上で64ビットゲストを実行できるようになりました。Intelは、x86-64実装 ( Intel 64 )にセグメンテーションのサポートを追加しなかったため、Intel CPU上では64ビットソフトウェアのみによる仮想化は不可能でしたが、Intel VT-xのサポートにより、Intelプラットフォーム上で64ビットハードウェア支援仮想化が可能になりました。[ 13 ] [ 14 ] : 4
プラットフォームによっては、基盤となるプロセッサが64ビットであり、必要な仮想化拡張機能をサポートしている場合、32ビットのホストOS上で64ビットのゲストOSを実行することが可能です。
x86ハードウェア仮想化の第一世代は、特権命令の問題に対処しました。仮想化されたシステムメモリのパフォーマンスの低さの問題は、後にチップセットに追加されたMMU仮想化によって解決されました。2005年と2006年に、 IntelとAMDは(それぞれ独立して)x86アーキテクチャの新しいプロセッサ拡張機能を作成し、その結果、バイナリ互換性のない2つの異なるx86仮想化拡張機能、IntelのVT-xとAMD-Vが誕生しました。
Intel 80286は保護モードで DOS アプリケーションを同時にうまく実行できなかったため、Intel は80386チップで仮想 8086 モードを導入し、386 以降のチップで仮想化された 8086 プロセッサを提供しました。しかし、保護モード自体を仮想化するためのハードウェア サポートは、20 年後に利用可能になりました。[ 15 ]

AMDは、コードネーム「Pacifica」の下で第一世代の仮想化拡張機能を開発し、当初はAMD Secure Virtual Machine(SVM)[ 16 ]として公開しましたが、後にAMD Virtualization(略称AMD-V)という商標で販売しました。
2006年5月23日、AMDは、この技術をサポートする最初のAMDプロセッサとして、Athlon 64(「Orleans」)、Athlon 64 X2(「Windsor」)、およびAthlon 64 FX(「Windsor」)を発売しました。
AMD-V 機能は、ソケット AM2のリビジョン「F」または「G」を持つAthlon 64およびAthlon 64 X2ファミリーのプロセッサ、Turion 64 X2、第 2 世代[ 17 ]および第 3 世代[ 18 ]のOpteron PhenomおよびPhenom IIプロセッサにも搭載されています。APU Fusionプロセッサは AMD-V をサポートしています。Socket 939プロセッサはAMD-V をサポートしていません。AMD -V をサポートするSempronプロセッサは、APU とHuron、Regor、Sargasデスクトップ CPUのみです。
AMD Opteron CPU(ファミリー0x10 Barcelonaシリーズ以降)およびPhenom II CPUは、Rapid Virtualization Indexing(開発中はNested Page Tablesとして知られていた)と呼ばれる第2世代のハードウェア仮想化技術をサポートしており、後にIntelによってExtended Page Tables(EPT)として採用されました。
2019年現在、ZenベースのAMDプロセッサはすべてAMD-Vをサポートしています。
AMD-V のCPUフラグは "svm" です。これは、 BSD 派生システムではdmesgまたはsysctl を介して、Linuxでは を介して確認できます。[ 19 ] AMD-V の命令には、VMRUN、VMLOAD、VMSAVE、CLGI、VMMCALL、INVLPGA、SKINIT、および STGI が含まれます。/proc/cpuinfo
一部のマザーボードでは、アプリケーションがAMD SVM機能を使用する前に、BIOS設定でAMD SVM機能を有効にする必要があります。 [ 20 ]

以前は「Vanderpool」というコードネームで呼ばれていたVT-xは、x86プラットフォーム上での仮想化のためのIntelの技術です。2005年11月14日、IntelはVT-xをサポートする最初のIntelプロセッサとして、 Pentium 4の2つのモデル(モデル662と672)をリリースしました。VT-x機能のCPUフラグは「vmx」です。Linuxでは、/proc/cpuinfoまたはmacOSではで確認できますsysctl machdep.cpu.features。[ 19 ] [ 21 ] [ 22 ]
「VMX」は仮想マシン拡張機能の略で、VMPTRLD、VMPTRST、VMCLEAR、VMREAD、VMWRITE、VMCALL、VMLAUNCH、VMRESUME、VMXOFF、VMXON、INVEPT、INVVPID、VMFUNC の 13 個の新しい命令を追加します。[ 23 ]これらの命令により、ゲスト OS が完全な特権 (リング 0) で実行されていると認識する仮想実行モードに入ったり出たりできますが、ホスト OS は保護されたままです。
2015年現在ほぼすべての最新のサーバー、デスクトップ、モバイル Intel プロセッサは VT-x をサポートしており、Intel Atomプロセッサの一部が主な例外となっています。[ 24 ]一部のマザーボードでは、アプリケーションが VT-x 機能を使用する前に、BIOS設定で Intel の VT-x 機能を有効にする必要があります。 [ 25 ]
Intel は、2008年にリリースされたNehalemアーキテクチャ[ 28 ] [ 29 ]以降、ページ テーブル仮想化の技術である拡張ページ テーブル(EPT) [ 26 ]を組み込むようになりました。2010年にWestmere は、論理プロセッサをリアル モードに直接起動するサポートを追加しました。これは「無制限ゲスト」と呼ばれる機能で、EPT が動作する必要があります。[ 30 ] [ 31 ]
2013 年に発表されたHaswellマイクロアーキテクチャ以降、Intel はVMCS シャドウイングをVMM のネストされた仮想化を高速化する技術として採用し始めました。 [ 32 ] 仮想マシン制御構造(VMCS) は、 VMM によって管理される、VM ごとに正確に 1 つだけ存在するメモリ内のデータ構造です。異なる VM 間で実行コンテキストが変更されるたびに、VMCS は現在の VM 用に復元され、VM の仮想プロセッサの状態が定義されます。[ 33 ]複数の VMM またはネストされた VMM が使用されるとすぐに、上記のようにシャドウ ページ テーブル管理が考案される必要があったのと同様の問題が発生します。このような場合、VMCS は (ネストの場合) 複数回シャドウイングする必要があり、プロセッサによるハードウェア サポートがない場合は、ソフトウェアで部分的に実装する必要があります。シャドウ VMCS の処理をより効率的にするために、Intel は VMCS シャドウイングのハードウェア サポートを実装しました。[ 34 ]
VIA Nano 3000シリーズプロセッサ以降は、Intel VT-xと互換性のあるVIA VT仮想化技術をサポートしています。[ 35 ] EPTは、 Nano C4350ALと同様にVIA QuadCore-EおよびEden X4の後継であるZhaoxin ZX-Cに搭載されています。[ 36 ]
2012年、AMDは仮想化環境における割り込みオーバーヘッドの削減を目的としたAdvanced Virtual Interrupt Controller(AVIC )を発表しました。 [ 37 ]この技術は、発表されたとおり、 x2APICをサポートしていません。[ 38 ] 2016年、AVICはAMDファミリー15hモデル6Xh(Carrizo)プロセッサ以降で利用可能になりました。[ 39 ]
また、2012年にインテルは割り込みとAPIC仮想化のための同様の技術を発表しましたが、発表時点ではブランド名は付けられていませんでした。[ 40 ]後にAPIC仮想化(APICv)[ 41 ] というブランド名が付けられ、インテルのIvy Bridge EPシリーズのCPU で市販されるようになりました。このCPUは、Xeon E5-26xx v2(2013年後半発売)とXeon E5-46xx v2(2014年初頭発売)として販売されています。[ 42 ]
グラフィックス仮想化は、x86アーキテクチャには含まれていません。Intel Graphics Virtualization Technology (GVT) は、より新しい世代のグラフィックスアーキテクチャの一部としてグラフィックス仮想化を提供します。AMD APUはx86-64命令セットを実装していますが、グラフィックス仮想化をサポートしていないAMD独自のグラフィックスアーキテクチャ(TeraScale、GCN、RDNA )を実装しています。Larrabeeはx86ベースの唯一のグラフィックスマイクロアーキテクチャでしたが、グラフィックス仮想化のサポートは含まれていなかったと考えられます。
メモリとI/Oの仮想化はチップセットによって実行されます。[ 43 ]通常、これらの機能はBIOSによって有効化される必要があり、BIOSはそれらをサポートでき、またそれらを使用するように設定されている必要があります。

入出力メモリ管理ユニット(IOMMU)は、DMAと割り込みリマッピングを介して、ゲスト仮想マシンがイーサネット、アクセラレーテッドグラフィックスカード、ハードドライブコントローラなどの周辺機器を直接使用できるようにします。これは、 PCIパススルーと呼ばれることもあります。[ 44 ]
IOMMUは、メモリアドレス変換を用いることで、オペレーティングシステムが、オペレーティングシステムのメモリアドレス空間よりも小さいメモリアドレス空間を持つ周辺機器と通信するために必要なバウンスバッファを排除することを可能にします。同時に、IOMMUは、オペレーティングシステムとハイパーバイザが、バグのあるハードウェアや悪意のあるハードウェアによってメモリセキュリティが侵害されるのを防ぐことも可能にします。
AMDとIntelはともにIOMMUの仕様を公開した。
CPU のサポートに加えて、マザーボードのチップセットとシステム ファームウェア ( BIOSまたはUEFI ) の両方が IOMMU I/O 仮想化機能を完全にサポートしている必要があります。この機能を使用するには、仮想マシン間でさまざまなデバイス機能を再割り当てする必要があるため、機能レベル リセット(FLR)をサポートするPCIまたはPCI Expressデバイスのみがこの方法で仮想化できます。 [ 48 ] [ 49 ] 割り当てるデバイスがメッセージ シグナル割り込み(MSI) をサポートしていない場合、割り当てを可能にするには、他のデバイスと割り込みラインを共有してはなりません。 [ 50 ] PCI/ PCI-Xから PCI Express ブリッジの背後にルーティングされている すべての従来の PCIデバイスは、一度にすべてゲスト仮想マシンにのみ割り当てることができます。PCI Express デバイスには、このような制限はありません。
PCI-SIG シングル ルート I/O 仮想化 (SR-IOV)は、PCI-SIG によって標準化された、 PCI Express (PCIe) ネイティブ ハードウェアに基づく一連の一般的な (x86 に特化していない) I/O 仮想化方法を提供します。 [ 52 ]
SR-IOV は、これらのうち最も一般的なもので、ホスト VMM がサポートされているデバイスを構成して、構成空間の仮想「シャドウ」を作成して割り当て、仮想マシンのゲストがそのような「シャドウ」デバイス リソースを直接構成してアクセスできるようにします。[ 54 ] SR-IOV を有効にすると、仮想化されたネットワーク インターフェイスにゲストが直接アクセスできるようになり、[ 55 ] VMM の関与が回避され、全体的なパフォーマンスが高くなります。[ 53 ]例えば、SR-IOV は、NASAの仮想化データセンター[ 56 ]およびAmazon パブリック クラウド[ 57 ] [ 58 ]で、ベア メタルネットワーク帯域幅の 95% 以上を達成しています。