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はホストOSの他のユーザー空間アプリケーションと同様に、ハードウェアへのアクセスが制限されています。x86ソフトウェアベースの仮想化でこのメカニズムを実装する手法の一つに、リング特権解除( ring deprivileging )があります。これは、ゲスト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 プロセッサー (経験則として、90 nm 以下で製造されたもの) では、ロング モードでのセグメント化の基本サポートが追加され、バイナリ変換によって 64 ビット ホストで 64 ビット ゲストを実行できるようになりました。 Intel は x86-64 実装 ( Intel 64 ) にセグメント化のサポートを追加しなかったため、Intel CPU 上で 64 ビットのソフトウェアのみの仮想化は不可能でしたが、Intel VT-x のサポートにより、Intel プラットフォーム上で 64 ビットのハードウェア支援による仮想化が可能になります。[ 13 ] [ 14 ] : 4
一部のプラットフォームでは、基盤となるプロセッサが 64 ビットであり、必要な仮想化拡張機能をサポートしている場合、32 ビット ホスト OS 上で 64 ビット ゲストを実行できます。
第一世代の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世代Opteron [ 17 ]および第3世代[ 18 ]のPhenomおよびPhenom IIプロセッサにも搭載されています。APU FusionプロセッサはAMD-Vをサポートしています。AMD-VはSocket 939プロセッサではサポートされていません。SempronプロセッサでAPUとHuron、Regor、SargasデスクトップCPUのみがAMD - Vをサポートして います。
Family 0x10 Barcelona ライン以降の AMD Opteron CPU および 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/proc/cpuinfoの2つのモデル(モデル662と672)をリリースしました。VT-x対応のCPUフラグは「vmx」です。Linuxでは、macOSでは で確認できますsysctl machdep.cpu.features。[ 19 ] [ 21 ] [ 22 ]
VMXはVirtual Machine Extensionsの略で、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 ]
インテルは、 2008年にリリースされたNehalemアーキテクチャ[ 28 ] [ 29 ]以降、ページテーブル仮想化技術である拡張ページテーブル(EPT)[ 26 ] [ 27 ]を搭載し始めました。 2010年にWestmereは、論理プロセッサをリアルモードで直接起動するためのサポートを追加しました 。これは「無制限ゲスト」と呼ばれる機能で、EPTが動作するために必要です。[ 30 ] [ 31 ]
Haswellマイクロアーキテクチャ(2013年発表)以降、IntelはVMMのネストされた仮想化を加速する技術としてVMCSシャドウイングを組み込み始めました。 [ 32 ] 仮想マシン制御構造(VMCS)はメモリ内のデータ構造で、VMごとに1つだけ存在し、VMMによって管理されます。異なるVM間で実行コンテキストが変更されるたびに、現在のVMのVMCSが復元され、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 ] 、インテルCPUのIvy Bridge EPシリーズ で市販され、 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 仕様を公開しています。
IOMMU I/O 仮想化機能を使用するには、CPU サポートに加えて、マザーボードの チップセットとシステム ファームウェア ( BIOSまたはUEFI )の両方がこの機能に完全に対応している必要があります。仮想マシン間でさまざまなデバイス機能を再割り当てするには機能レベル リセット(FLR) が必要なため、この方法で仮想化できるのは 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パブリッククラウドでベアメタルネットワーク帯域幅の95%以上を達成しています。[ 57 ] [ 58 ]