PopekとGoldbergの仮想化要件

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

**はじめに**
システムの仮想マシンとは、プロセッサ(複数の場合も含め)、メモリ、記憶装置や周辺機器といったハードウェア資源の全てを仮想化することができる仮想マシンである。
仮想マシンモニタ (VMM) は仮想マシンの抽象化層を提供するソフトウェアである。VMM が作り出す環境を調べる上で重要な三つの特性がある。
 等価性(Equivalence): VMM の元で動作するプログラムは、等価な実際のマシン上で直接実行した場合と本質的に同じ振る舞いを示さなければならない。
 資源の管理(Resource Control): VMM は仮想化された資源を完全にその管理下におかなければならない
 効率性(Efficiency): 統計的に大部分の機械の命令を VMM の介在なく実行できなければならない
Popek と Goldberg の述べるところでは、VMM は上記３つの特性を全て満たしていなければならない。現代的な 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 からの MOV 命令が新設され、条件コードに対してのみのアクセス方法を提供するようになった。

**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年11月13日に、 Intel VT 拡張によってPopekとGoldbergの仮想化要件を満たすx86プロセッサが実現された。AMD-V は2006年5月23日登場。

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

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

**関連項目**
 仮想機械- 仮想化

**参考文献**

**参考書籍**
   isbn=1-55860-910-5