PopekとGoldbergの仮想化要件

**PopekとGoldbergの仮想化要件**（****）とは、コンピュータアーキテクチャが効率的にシステムの仮想化を実現するための一群の十分条件である。ジェラルド・J・ポペック（）と ロバート・P・ゴールドバーグ（）の1974年の論文 "Formal Requirements for Virtualizable Third Generation Architectures" (仮想化可能な第三世代アーキテクチャへの要件) で示された
 。これらの要件は簡単のため仮定に基づいたものであったが、コンピュータアーキテクチャが十分な仮想化機能を備えているかどうかの判断基準と、仮想化されたコンピュータアーキテクチャの設計についての指針を示している。

## はじめに
システムの仮想マシンとは、プロセッサ（複数の場合も含め）、メモリ、記憶装置や周辺機器といったハードウェア資源の全てを仮想化することができる仮想マシンである。

仮想マシンモニタ (VMM) は仮想マシンの抽象化層を提供するソフトウェアである。VMMが作り出す環境を調べる上で重要な三つの特性がある。
; 等価性（）:VMMの元で動作するプログラムは、等価な実際のマシン上で直接実行した場合と本質的に同じ振る舞いを示さなければならない。
; 資源の管理（）:VMMは仮想化された資源を完全にその管理下におかなければならない
; 効率性（）:統計的に大部分の機械の命令をVMMの介在なく実行できなければならない

PopekとGoldbergの述べるところでは、VMMは上記3つの特性を全て満たしていなければならない。現代的なVMMは等価性と資源の管理を実現しているものとされ、PopekとGoldbergの定義するVMMは現代でも十分なVMMである。

PopekとGoldbergは上述の特性をそなえた VMMを実行するために実マシンが備えるべき命令セットアーキテクチャ (ISA) の特徴を示した。彼らの分析は "第三世代アーキテクチャ"（例えばIBM 360、Honeywell 6000、DEC PDP-10）のモデルに基づいたものであったが、それでも十分汎用的であり、現代のマシンにも拡張することができる。このモデルにはシステムモード・ユーザーモードで動作するプロセッサ、リニアなアドレス空間で統一的にアクセスできるメモリなどが含まれており、命令セットの一部はシステムモードでしか使用できず、メモリは再配置レジスタからの相対番地でアクセスされる。I/Oや割り込みはモデル化されなかった。

## 仮想化要件
仮想化要件を導き出すため、PopekとGoldbergは命令セットの各命令について、以下の3種類の分類を導入した。
; 特権命令:その命令を実行しようとした時、プロセッサがユーザーモードにあれば、トラップされる命令
; 制御センシティブ命令:システム資源の構成を変えようとする命令
; 動作センシティブ命令:システムの資源の構成（再配置レジスタやプロセッサモード）に、動作や結果が依存する命令

PopekとGoldbergの分析結果は下記のものである。

**定理1**. 一般的な第三世代コンピュータについて、その全てのセンシティブ命令が特権命令であればVMMを構築することができる

直感的には、この定理は、VMMを構築するためには、VMMの正常な動作に影響しうる全ての命令（センシティブ命令）は、常にトラップしてVMMに制御を渡すことが十分条件である、というものである。このことは、資源管理の特性を保証する。また、非特権命令を直接（すなわち効率的に）実行することができ、等価性の特性も保つことができる。

関連する問題として、再帰的な仮想化、すなわちVMMが同じVMM上で動作するような場合のISA要件を導出するという問題がある。

**定理2**. 一般的な第三世代コンピュータについて、下記の条件が満たされれば再帰的な仮想化が可能である
# 仮想化可能であり
# かつ、タイミング依存がないVMMが構築できること

## クリティカルな命令の扱い
効率性の特性を犠牲にすれば、定理1で示されたISA仮想化の条件を緩めることができる。過去にも（PopekとGoldbergの定義で）仮想化可能でないISA用のVMMは何度となく実現されてきた。

このようなアーキテクチャの仮想化には、「クリティカルな命令」すなわち、センシティブであるにもかかわらず、特権命令ではない命令を適切に扱う必要がある。これを実現する方法の一つ は動的再コンパイルで用いられる手法によりクリティカル命令を実行時に発見し、VMMへのトラップに置き換える「パッチ」として知られる方法である。パッチをうまく働かせるためにエミューレーションコードをキャッシュしたり、ハードウェアの支援により高速化するといった様々な手法が提案されている。別のアプローチとして準仮想化の方法があり、これには仮想環境で動作させる前にゲストのオペレーティングシステムを修正する（VMMに移植する）必要がある。

## 命令セット
本節ではいくつかのアーキテクチャを示し、仮想化要件をどの程度満たすかについて述べる。

### PDP-10
PDP-10のアーキテクチャはセンシティブ命令（プロセッサモードの変更、取得）をいくつか備えるが、これらは特権命令ではない
。

下記の命令はUSERあるいはIOTビットを含む条件コードの変更、読み出しを行う。
* JSR: サブルーチンにジャンプ
* JSP: ジャンプしてプログラムカウンタを保存
* PUSHJ: プッシュしてジャンプ
* JRST: ジャンプして条件コードを読み出し

### System/370
System/370ではセンシティブ命令がすべて特権命令であり、仮想化要件を満たす。

### Motorola MC68000
Motorola MC68000 は特権命令でないセンシティブ命令をひとつ持つ。
* SR レジスタからの MOVE
この命令は条件コードだけではなく、プロセッサモード（ユーザー/特権）のビットや、割り込みレベルなどを含む
ステータスレジスタ全体にアクセスできるので、センシティブ命令である。後に登場したMC68010以降では、SRからのMOVE命令は特権化され、またCCRからのMOVE命令が新設され、条件コードに対してのみのアクセス方法を提供するようになった。

### IA-32 (x86)
IA-32の命令セットには、非特権のセンシティブ命令が17個ある 。これらは、二種類に分類できる。

* センシティブなレジスタの操作: センシティブなレジスタへの読み書き、クロックや割り込みなどのメモリ番地への読み書きを起こし得る命令
** SGDT, SIDT, SLDT
** SMSW
** PUSHF, POPF
* システム保護命令: 記憶域保護の機構、メモリ、アドレス再配置機構への参照を起こし得る命令
** LAR, LSL, VERR, VERW
** POP
** PUSH
** CALL, JMP, INT n, RET
** STR
** MOV

2005年に、 Intel VT拡張によってPopekとGoldbergの仮想化要件を満たすx86プロセッサが実現された。AMD-V は2006年登場。x86の仮想化全般に関する話題はx86仮想化の記事を参照。

### IA-64
IA-64アーキテクチャ上で仮想化を行うための方法が、2000年のMagenheimerとChristianの論文で述べられている。

### SPARC
UltraSPARCアーキテクチャの超特権（）モードについて、*sun4u*プラットフォームのスーパーセットでSPARC v9 Level-1と互換性のある*sun4v*プラットフォームを定義した*UltraSPARC Architecture 2005*'仕様書 で述べられている。

## 関連項目
* 仮想マシン
* 仮想化

## 脚注

## 参考文献
*