X86仮想化

**x86仮想化**とは、x86ベースのゲストオペレーティングシステム (OS) を、別のx86ベースのホストOS上で、ほとんど（あるいは全く）ゲストOSを修正することなく動作させる手法である。

旧来のx86アーキテクチャは、命令セット中に特権命令でないセンシティブな命令がある。このためPopekとGoldbergの仮想化要件を満たしていない（具体的にはPopekとGoldbergの仮想化要件#IA-32 (x86)を参照）。2005年と2006年、インテルとAMDがそれぞれx86アーキテクチャを拡張することでこれに対応し、他の仮想化での問題にも対処した。

**Intel VT**の名称で知られるインテルによる実装についてはインテル バーチャライゼーション・テクノロジーの項目を、**AMD-V**および**AMD-Vi**などの名称で知られるAMDによる実装については本記事のAMD-V節を参照のこと。

## ソフトウェア技法
1999年2月8日、VMwareは初のx86仮想化製品 "VMware Virtual Platform" をリリースした。これは、同社の創業者がスタンフォード大学で行っていた研究成果に基づいたものである。VMwareはその技法を1998年10月に特許申請し、2002年5月28日にとして特許が成立した。

VMwareや類似する仮想化ソフトウェアがハードウェア仮想化支援機能を持たないx86向けの仮想化する場合、特定の命令の実行を捉えて動的に置き換える動的命令変換技法を必ず使用している。
この技法は、本質的に仮想化可能なアーキテクチャ（例えばIBM System/370やMC68020）での仮想マシンに比較すると性能に対する何らかのオーバーヘッドを抱えている。

Kevin Lawtonは、x86仮想化のための自由ソフトウェアを作成するPlex86プロジェクト（以前は "freemware" と称していた）を開始した。このプロジェクトはLinuxのみをゲストOSとするプロジェクトに変質してしまった。
しかし、それ以前にLawtonは "Running multiple operating systems concurrently on an IA32 PC using virtualization techniques"（IA32 PC上で仮想化技法を使って複数OSを同時並行動作させる）という論文を発表しており、その中でx86アーキテクチャの仮想化困難な部分の分析を行い、その対処方法を論じている。

オープンソースでもx86仮想化の試みは行われた。x86プロセッサの命令実行をエミュレートする方式を採ったものとして、Bochs、QEMU、当初プロプエタリソフトとして公開され最終的にGPLライセンスになったVirtualBoxがある。KVMではQEMUがCPUをはじめとする周辺機器のエミュレーションを担っている。

マイクロソフトはWindowsベースのx86仮想化製品を3種類提供している。Connectixから得た技術に基づいたVirtual PCとVirtual Server、そしてHyper-Vである。

実験的システムDenali、L4、Xenは、元のハードウェアと仮想マシンの実装を変えることでx86仮想化の高性能化を模索したものである。OSをその仮想マシン向けに移植することで、x86命令セットの仮想化しにくい部分を実装するのを避けている。この技法を準仮想化と呼ぶ。

その後、Xen 3.0では、後述するハードウェア仮想化支援を利用した完全仮想化もサポートしており、OSに全く変更を加えなくてもよい。

現在、x86仮想化を行うソフトウェアの多くはハードウェア仮想化支援による完全仮想化を実現している。

## ハードウェア仮想化支援
インテルとAMDはそれぞれ独自にx86アーキテクチャの仮想化拡張を開発した。両者の実装は完全な互換性はないが、機能はほぼ同じである。どちらの場合も仮想マシンハイパーバイザ上でゲストOSを修正することなく動作させることが可能であり、性能も従来より大幅に向上する。

x86プラットフォームでの仮想化技術の展開により、これらは「**ハードウェア仮想化支援機能**」（HAV：Hardware-Assisted Virtualization）と呼ばれている。

ハードウェア仮想化支援機能は、マイクロプロセッサベンダーごとに実装が分かれている。インテル製品には**Intel Virtualization Technology** (**Intel VT**)、AMD製品には**AMD Virtualization** (**AMD-V**) を中心とした、様々な仮想化支援技術が搭載されている。

### プロセッサ
#### Intel VT-x

**VT-x**とは、インテルによるx86プラットフォームの仮想化技術である。開発当初は**Vanderpool**のコードネームが用いられ、発表初期においても**Vanderpool Technology**の名称が用いられた。

#### AMD-V
**AMD Virtualization** (**AMD-V**) は、AMDによる x86アーキテクチャのハードウェア仮想化拡張技術と仮想化システムに対するセキュリティ機能を合わせた技術である。後者については、本記事のチップセット節で説明する*AMD-Vi*も参照のこと。

AMDの仮想化拡張は64ビットx86アーキテクチャ向けであり、以前は Pacifica というコードネームで呼ばれ、初期のAMD-Vは2006年に発表された。

AMD-VはAthlon 64とAthlon 64 X2のファミリ "F" または "G"（ソケットはSocket AM2）、Turion 64 X2、Opteron第二世代と第三世代、AMD Phenom、およびこれら以降のプロセッサに搭載されている。

### <span id="SLAT"></span>SLATプロセッサ（第2世代）
**Second Level Address Translation** (**SLAT**) とは、メモリ管理に関する仮想化を支援するCPUの機能で、仮想マシンごとに独立した仮想アドレスと、ホスト環境の物理アドレスの変換を、ハードウェアレベルで支援する。実装として**Intel EPT** (Extended Page Table) や **AMD RVI** (Rapid Virtualization Indexing) 等が知られる。

Intel VT-xやAMD-Vと同様にハードウェアレベルで仮想化を支援する事から、第2世代 (Second Level) の仮想化支援技術とされる。

#### Intel EPT

#### AMD RVI

### チップセット
メモリとI/Oの仮想化はチップセットで実行される。これらの利用には、一般的に支援機能の搭載だけでなく、BIOSを適切に設定することが必要である。

#### IOMMUの仮想化 (VT-d と AMD-Vi)

Input/Output Memory Management Unit (IOMMU) は、DMAのスルーと割り込みの再割り当てにより、イーサネット、グラフィックカード、ハードディスクコントローラなどのゲスト仮想マシンからの直接的な物理デバイスの利用を可能にする。これらは「**PCIパススルー**」と呼ばれることがある。

IntelおよびAMDは、次の仕様を発表している：

* Intel **Virtualization Technology for Directed I/O** (**VT-d**)
:インテルのI/O処理の仮想化支援機能。Nehalemベースのプロセッサの大半に含まれている。

* AMD **AMD-Vi** （以前は、単に"*IOMMU*"と呼んでいた）
:AMDは、AMD-V向けのIOMMUの仕様を発表した。これにより、個々の仮想マシンに割り込みを配送する設定が可能となり、DMA使用部分で仮想マシン間の分離ができなくなる問題に対処した。仮想化抜きでもIOMMUは最近のOSでは重要な役割を果たしており、AMD Torrenzaアーキテクチャでも重要な部分を占めている。

#### ネットワークの仮想化 (VT-c)
* Intel **Virtualization Technology for Connectivity** (**VT-c**)
:インテルのI/O仮想化を支援する関連技術。Virtual Machine Device Queues (VMDq)、Intel I/O Acceleration Technology (I/OAT)、Single Root I/O Virtualization で構成される。

#### PCI-SIGによるI/O仮想化 (IOV)
**PCI-SIG I/O virtualization** (**IOV**) は、PCI-SIGが標準化を行っている、PCI ExpressベースのネイティブなハードウェアI/O仮想化技術の総称である。IOVに対応するデバイスは、ゲストOS間で一つのリソースを共有できる。

IOVは、I/O仮想化に関して次の仕様を定めている:

*アドレス変換サービス規格 (ATS)
:**Address translation services**は、アドレスの交換と翻訳に使用する、PCI Expressの為の変換コンポーネントに関する仕様を定める。

*Single-Root デバイス共有規格 (SR-IOV)
:**Single-root IOV**は、既存のシステムのような、ルートが一つしか存在しないPCI ExpressトポロジにおけるネイティブなI/O仮想化を支援する。つまり、一台の物理的なコンピュータにおいて仮想化支援を行うものである。

*Multi-Root デバイス共有規格 (MR-IOV)
:**Multi-root IOV**は、ブレードサーバのようにPCI Expressを共有する複合的な多重ルート階層を持つ環境において、SR-IOVを前提としてネイティブなI/O仮想化を支援する。つまり、SR-IOVを持つ複数台の物理的なコンピュータ間で、ハードウェアの仮想化支援・共有を行うものである。

### ソフトウェアの対応
以下のソフトウェアは、条件によってはこれらの仮想化技術を使っている。

* Hyper-V — 旧名Windows Server Virtualization。複数の仮想サーバを実行する機能があり、ハードウェアによる仮想化サポート（Intel VT-x、AMD-V）が必須である。Windows Server 2008、Windows Server 2008 R2、Windows Server 2012、Windows Server 2012 R2、Windows 8 Pro、Windows 8 Enterprise、Windows 8.1 Pro、Windows 8.1 Enterpriseで提供されている。
* Kernel-based Virtual Machine (KVM) — Linuxカーネルモジュール型のハイパーバイザ。ハードウェアによる仮想化サポート（Intel VT-x、AMD-V）が必須。CPUをはじめとする周辺機器のエミュレーションにQEMUを用いている。
* Microsoft Virtual PC
** Virtual PC 2007 — Intel VT-xとAMD-Vをサポート。
** Windows Virtual PC — Windows 7専用。Intel VT-xとAMD-Vをサポート。
* Microsoft Virtual Server — Virtual Server 2005 R2 SP1 はハードウェア支援仮想化をサポート
* Parallels Workstation と Parallels Desktop for Mac — 軽量ハイパーバイザ。Intel VT-xとAMD-Vをサポート。
* VirtualBox — Intel VT-xとAMD-Vをサポート。
* VMware
** VMware Workstation — Intel VT-xとAMD-Vをサポート。
** VMware Player — Intel VT-xとAMD-Vをサポート。Ver.3.0以降より正式にゲストOSを作成できるようになった。
** VMware Fusion
** VMware ESX Server — ESX Server 3.5ではIntel VT-xは64ビットゲストを動作させるためだけに使用。
** VMware Server — Intel VT-xとAMD-Vをサポート。
* Xen — Xen 3.0.2でIntel VT-xとAMD-Vをサポート。Xen 3.2.1でIntel VT-dをサポート。Xen 3.3ではIntel VT-cをサポート予定。

### 性能
Standard Performance Evaluation Corporation (SPEC) は、仮想化技術の性能比較の業界標準手法を確立するためのワーキンググループを創設した。現在のメンバーは、AMD、デル、富士通シーメンス、ヒューレット・パッカード、インテル、IBM、サン・マイクロシステムズ、SWsoft、VMwareである。SPECは現在最善のベンチマークを開発すべく情報収集中である。

## 脚注

## 外部リンク
*AMD Virtualizationのすべて

## 関連項目
* 仮想化
* 仮想マシン
* エミュレータ
* 準仮想化