Document

仮想機械
温故知新
前田俊行
東京大学米澤研究室
目次
• 論文
“Architecture of Virtual Machines”
の紹介
• 論文
“Formal requirements for
Virtualizable Third Generation Architectures”
の紹介
• IBM VM/370 の紹介(中間報告)
今回扱う “VM”
• ハードウェアインターフェイスを
仮想化するタイプの VM
– 特に、現実のハードウェアと仮想ハードウェアの
アーキテクチャが同一である VM
Architecture of Virtual Machines
Robert P. Goldberg
In Proceedings of the workshop on virtual computer systems
74-112 (1973)
この論文の要点
• VM システムのアーキテクチャモデルを提案
– 2つのマッピング
• φ-マップと f -マップ
• 新しい VM システムの実装方法を提案
– Hardware Virtualizer
• VM を効率良く実装可能
– 再帰的 VM も効率良く実現できる
φ-マップ
• OSインターフェイスから
ハードウェアインターフェイスへのマップ
–例
• 仮想メモリ → 物理メモリ
• スレッド → 物理CPU
• ファイル → 物理ディスク
φ-マップ
ユーザプログラム
OS
ハードウェア
f -マップ
• ハードウェアインターフェイスから
ハードウェアインターフェイスへのマップ
– 例:
• VMの物理メモリ → 物理メモリ
• VMの物理 CPU → 物理 CPU
• VMの物理ディスク → 物理ディスク
f -マップ
OS
VMM
ハードウェア
2つのマップによる
VM システムの表現
通常の VM システム
φ
ユーザプログラム
OS
f
VMM ハードウェア
2つのマップによる
VM システムの表現
再帰的 VM システム
φ
ユーザプログラム
OS
f
f
f
f
VMM VMM VMM VMM ハードウェア
形式的定義: プロセス名とリソース名
• プロセス名 p:
OSインターフェイスを抽象化したもの
– (例) 仮想メモリのアドレス、仮想CPUのレジスタ、
ファイルシステムのファイル名とファイルポインタの組等
• リソース名 r:
ハードウェアインターフェイスを
抽象化したもの
– (例) 物理メモリのアドレス、物理CPUのレジスタ、
物理ディスクのアドレス等
形式的定義: φ-マップ
φは部分関数で
φ: P → R
ここで P はプロセス名 p の集合
P = { p0, p1, …, pj }
また R はリソース名 r の集合
R = { r0, r1, …, rn }
形式的定義: f -マップ
f は部分関数で
f: R1 → R2
ここで R1、R2 は
それぞれリソース名 r の集合
φと f による VM システムの表現
• 通常の VM システム
f φ: P → R2
f とφの合成
• 再帰的 VM システム
f4 f3 f2 f1 φ: P → R5
φと f による VM システムの表現
φ
ユーザプログラム
p1
rv1
p2
rv2
p3
rv3
OS
f
rr1
rr2
VMM ハードウェア
(例)
φ= { p1 → rv2,
p3 → rv3 } のとき、ユーザプログラムが
p1 にアクセスすると、
f = { rv1 → rr2,
OS と VMM により、
rv2 → rr1 }
φ(f(p1)) = rr1 へのアクセスに
変換される
未定義のプロセス名、リソース名の扱い
• あるφ-マップ、f-マップで未定義の
プロセス名やリソース名が利用されたら、
そのφ-マップ、f-マップを実装するOS、VMM に
適当な処理をさせなければならない
未定義のプロセス名、リソース名の扱い
φ
ユーザプログラム
p1
rv1
p2
rv2
p3
rv3
OS
f
rr1
rr2
VMM ハードウェア
(例)
φ= { p1 → rv2,
p3 → rv3 } のとき、ユーザプログラムが
p2 にアクセスしたら、
f = { rv1 → rr2,
例外を発生させ
rv2 → rr1 }
OS に処理させなければならない
未定義のプロセス名、リソース名の扱い
φ
ユーザプログラム
p1
rv1
p2
rv2
p3
rv3
OS
f
rr1
rr2
VMM ハードウェア
(例)
φ= { p1 → rv2,
p3 → rv3 } のとき、ユーザプログラムが
p3 にアクセスしたら、
f = { rv1 → rr2,
例外を発生させ
rv2 → rr1 }
VMM に処理させなければならない
モデルから見た VM システム実装
CP-67
φ の実装
f の実装
ハードウェア ソフトウェア
φや f の合成 再帰的 VM
ソフトウェア
不可能
VMware
ハードウェア ソフトウェア
ソフトウェア
不可能
Bochs
ソフトウェア
ソフトウェア
可能
ソフトウェア
モデルから見た VM システム実装
CP-67
φ の実装
f の実装
ハードウェア ソフトウェア
φや f の合成 再帰的 VM
ソフトウェア
不可能
VMware
ハードウェア ソフトウェア
ソフトウェア
不可能
Bochs
ソフトウェア
ソフトウェア
注
φと f の合成が
ソフトウェア
可能
ソフトウェアで行われていても
その合成結果 (φ’= f φ) は
ハードウェアで実装できる
モデルから見た VM システム実装
φ の実装
f の実装
φや f の合成 再帰的 VM
Hardware ハードウェア ハードウェア ハードウェア 可能
Virtualizer
CP-67
ハードウェア ソフトウェア
ソフトウェア
不可能
VMware
ハードウェア ソフトウェア
ソフトウェア
不可能
Bochs
ソフトウェア
ソフトウェア
可能
ソフトウェア
Hardware Virtualizer
• φ-マップや f -マップの合成を
ハードウェアでサポートするという
VM システムアーキテクチャ
– 実際に実装されたかは不明
– 特許は取られている
» 米国特許4253145 (出願1978年: もう期限切れ?)
Hardware Virtualizer の
構成要素
• VMID レジスタ
– 現在どの VM を実行中かを表す
• マップ合成機構
– Φや f を合成するハードウェア機構
• 例外振分け機構
– 例外や割込を正しい OS、VMM に届けるための
ハードウェア機構
Formal Requirements
for Virtualizable
Third Generation Architecture
Gerald J. Popek
Robert P. Goldberg
In Communications of the ACM 17(7): 412-421 (1974)
この論文の要点
• VM を実現するために
第三世代アーキテクチャが
満たすべき十分条件を
形式的に示した
– 条件: sensitive 命令 ⊆ privileged 命令
• 第三世代アーキテクチャ
– ここでは特権レベル機構や仮想メモリ機構のある
アーキテクチャのことをいう
形式的定義
マシン状態: S
S = ( E, M, P, R )
E : メモリ
M: 実行モード
P : プログラムカウンタ
R : セグメントレジスタ
形式的定義
メモリ: E
E = サイズ q の配列
形式的定義
実行モード: M
M = s または u
s : supervisor モード
u : user モード
形式的定義
プログラムカウンタ: P
P = メモリアドレス
(配列 E のインデックス)
形式的定義
セグメントレジスタ: R
R = (Base, Size)
Base: セグメントのベースアドレス
Size : セグメントのサイズ
マシン状態の例
S = ( [ 4, 5, 1, halt ],
s, 2, (1, 3) )
マシンが上のような状態 S にあるとき、
そのマシンは supervisor モードで実行中で、
かつ、halt 命令を実行しようとしている
pc = 2 だが、R = (1, 3) なので、
実行される命令は E(2+1) = E(3) = halt である
形式的定義
命令: i
i は関数で
i:C→C
C : S の有限集合
形式的定義:
Trap
• 命令 i は次の条件を満たすとき
“Trap する”という
i (E1, M1, P1, R1) = (E2, M2, P2, R2)
ただし
E2[k] = E1[k], for 0 < k < q
E2[0] = ( M1, P1, R1)
( M2, P2, R2) = E1[1]
つまり、命令実行前の (M, P, R) が E[0] にセーブされ、
命令実行後の (M, P, R) が E[1] からロードされるようなとき
形式的定義:
Memory Trap
• Trap する命令 i は次の条件を満たすとき
“Memory Trap する”という
S = ( E, M, P, (Base, Size) ) において
命令 i のアクセスするアドレス a が
Size < a
(セグメントサイズオーバー)
または
q < Base + a (メモリサイズオーバー)
を満たす
形式的定義
Privileged
• 命令 i は以下の条件を満たすとき
Privileged であるという
任意の
S1= (E, s, P, R)
S2= (E, u, P, R)
ただし、i(S1)もi(S2)も Memory Trap しない
において
i(S1) は Trap しない
i(S2) は Trap する
つまり、user モードで実行すると Trap する命令
形式的定義
Control Sensitive
• 命令 i は以下の条件を満たすとき
Control Sensitive であるという
S1= (E1, M1, P1, R1)
i(S1)= S2= (E2, M2, P2, R2)
ある
において
ただし、i(S1)は Memory Trap しない
M1≠M2 and/or R1≠R2
つまり、命令実行後に、例外が生じることなく
メモリマッピングが変わったり実行モードが変わったりすること
Control Sensitive な命令の例
• 仮に IA-32 で例えるならば
– int 命令 (ソフトウェア割込命令)
• 実行後に実行モード (= M) が変わる場合がある
– mov 命令 (メモリ操作命令)
• ページテーブル、GDT、LDT等へのメモリ操作は
R を変更することと対応する
– など
注: ここでの抽象化モデルと IA-32 は必ずしも一致しないので
ここで挙げた例は、定義に厳密に基づいたものではない
形式的定義
Behavior Sensitive
• 命令 i は以下の条件を満たすとき
Behavior Sensitive であるという
ある
S1= (E1, M1, P, R)
S2= (E2, M2, P, R+x)
R = (b, s) のとき
R+x = (b + x, s)
ただし、i(S1)も i(S2)も Memory Trap せず
i(S1) = (E’1, M1, P1, R)
E1| (b,s) = E2| (b,s) +x
i(S2) = (E’2, M2, P2, R+x)
⇔
0≦ k < s なる k で
E1|R = E2|R+x
において
E1[b+k] = E2[b+x+k]
E’1|R≠E’2|R+x and/or P1≠P2
つまり、命令実行の結果が、例外を生じることなく
メモリマッピングや実行モードによって異なること
Behavior Sensitive な命令の例
• 仮に IA-32 で例えるならば
– sgdt 命令 (GDTレジスタ読出命令)
• GDT レジスタ (= R に対応) の値によって結果が異なる
– push 命令 (メモリ操作命令)
• push CS の実行結果が実行モード (= M) によって異なる
– など
注: ここでの抽象化モデルと IA-32 は必ずしも一致しないので
ここで挙げた例は、定義に厳密に基づいたものではない
形式的定義
Sensitive
• 命令 i は Control Sensitive または
Beharior Sensitive であるとき
Sensitive であるという
定理 1
• あるアーキテクチャが
以下の条件を満たすとき
そのアーキテクチャは仮想化可能である
{ i | i は Sensitive }
⊆ { i | i は Privileged }
この条件を満たすアーキテクチャ上では、
ゲスト OS を user モードで実行すれば仮想化できる
定理 2
• あるアーキテクチャが
仮想化可能であるとき
そのアーキテクチャは
再帰的仮想化可能である
– 再帰的仮想化 = VM の上に VM を実現すること
定理1 と IA-32
• IA-32 には Sensitive であるが
Privileged でない命令が存在するので
IA-32 は条件を満たさない
• Sensitive であるが Privileged でない命令
– mov 命令、sgdt 命令、push 命令など
ハイブリッド仮想化
• Supervisor モードでは
命令をハードウェアで実行せずに
インタプリタで実行する仮想化の方式
– 純粋な仮想化よりも
アーキテクチャが満たすべき条件は緩い
形式的定義
User Sensitive
• 命令 i は以下の条件を満たすとき
User Sensitive であるという
S = (E, u, P, R)
において
i が Sensitive
つまり、user モードで実行されたとき
Sensitive となる命令
定理 3
• あるアーキテクチャが
以下の条件を満たすとき
そのアーキテクチャは
ハイブリッド仮想化可能である
{ i | i は User Sensitive }
⊆ { i | i は Privileged }
この条件を満たすアーキテクチャ上では、
ゲスト OS を インタプリタ実行すれば仮想化できる
定理3 と IA-32
• IA-32 には User Sensitive であるが
Privileged でない命令が存在するので
IA-32 は条件を満たさない
• User Sensitive であるが Privileged でない命令
– mov 命令、sgdt 命令など
VMware はどうしているか
• ハイブリッド仮想化
– ただし user モードで実行されるプログラムは
正しいハードウェアが見えない
• (例) sgdt 命令の結果は VM の GDT レジスタではなく
本物の GDT レジスタの値となる
– user モードプログラムが GDT を直接操作できるような OS が
あったら、その OS は正しく動作しないであろう
VMware はどうしているか
• ハイブリッド仮想化
– ページテーブルへのメモリ操作は、
IA-32 の仕様上 mov CR3 命令が実行されるまで
その操作が CPU に反映されないと見なせるので
問題はない
• Mov CR3 は Privileged 命令、
すなわちインタプリタ実行される
– そもそも user モードプログラムがページテーブルを
直接操作できるような OS でなければこの問題は存在しない
» なぜならページテーブルの操作 = Privileged 命令
と見なせるから
IBM VM/370
中間報告
IBM の汎用計算機の歴史
• System 360 (1964) Solid Logic による実装
• System 370 (1970) IC による実装
• System 390 (1990)
• いわゆる「メインフレーム」
• 基本的なアーキテクチャは
ほとんど変わっていない
– CISC、セグメント + ページング
IBM の VM の歴史
• CP-67 (1966)
• 仮想メモリ機構の欠けた VM を実現
• VM/370 (1972)
• 完全な VM を実現
– 再帰的 VM もサポートしているらしい
» VM/370 の新バージョンのデバッグは
VM/370 の古いバージョン上で行われたらしい
• z/VM 5.1 (2004)
VM/370 のアーキテクチャ
OS
VMM
CMS
DOS/360
OS/360
CP (= Control Program)
System/370
MVS
VM/370 の特徴
• 2つの仮想化モード
– V=R モード
• VM の物理アドレス = 本物の物理アドレス
として性能改善をはかるモード
• システムに1つだけ存在できる
– V=V モード
• VM の物理アドレスは本物の物理アドレスとは
関係なく、ページテーブルによって対応づけるモード
• いくつでも存在できる
– (これは S/390 上でのことだが、Linux を V=V モードで
約40000 も同時に実行した人もいるらしい)
続く…
• 現在までにまだ調べ終えていないこと
– VM/370 が本当に再帰的仮想化可能か?
– VM-Assist とは何か?
• System/370、VM/370 には
VM-Assist という VMM 実装を支援する
ハードウェア機構があるらしい
– など
終
予備スライド
Hardware Virtualizer による
再帰的 VM システムの例
0
VM1: 4, 8
4
VM1: 5, 3
VM2: 12, 5
物理メモリ空間
Hardware Virtualizer による
再帰的 VM システムの例
0
VM1: 4, 8
4
9
12
17
VM1: 5, 3
VM2: 12, 5
物理メモリ空間
これらが f を表す
ここでは簡単のため f は
セグメントマップ = (オフセット, サイズ)とする
Hardware Virtualizer による
再帰的 VM システムの例
VM1
0
VM1: 4, 8
4
VM2
9 VM1.1 12
17
VM1: 5, 3
VM2: 12, 5
物理メモリ空間
Hardware Virtualizer による
再帰的 VM システムの例
VM1
0
VM1: 4, 8
4
VM1: 5, 3
VM2
9 VM1.1 12
17
P1: 2, 1
VM2: 12, 5
物理メモリ空間
Hardware Virtualizer による
再帰的 VM システムの例
VM1
0
VM1: 4, 8
4
VM1: 5, 3
VM2
9 VM1.1 12
17
P1: 2, 1
VM2: 12, 5
物理メモリ空間
これがφを表す
ここでは簡単のためφも f 同様
セグメントマップ = (オフセット, サイズ)とする
Hardware Virtualizer による
再帰的 VM システムの例
VM1
0
VM1: 4, 8
4
VM1: 5, 3
VM2
9 VM1.1 12
17
P1: 2, 1
VM2: 12, 5
物理メモリ空間
プロセスP1
Hardware Virtualizer による
再帰的 VM システムの例
VM1
0
4
VM1: 4, 8
VM1: 5, 3
VM2
9 VM1.1 12
17
P1: 2, 1
VM2: 12, 5
物理メモリ空間
プロセスP1
今、プロセス P1 が VM1.1 上で
動作しているとする
このとき LMID レジスタ は 1.1 という値をとっている
Hardware Virtualizer による
再帰的 VM システムの例
VM1
0
4
VM1: 4, 8
VM2
9 VM1.1 12
VM1: 5, 3
17
P1: 2, 1
VM2: 12, 5
もしこのプロセス P1 が
アドレス 0 にアクセスすると…
(例: load 0)
物理メモリ空間
プロセスP1
Hardware Virtualizer による
再帰的 VM システムの例
VM1
0
4
VM1: 4, 8
VM1: 5, 3
VM2
9 VM1.1 12
17
P1: 2, 1
VM2: 12, 5
まずマップ合成機構は
φを見に行く
φ(0) = 2
物理メモリ空間
プロセスP1
Hardware Virtualizer による
再帰的 VM システムの例
VM1
0
4
VM1: 4, 8
VM1: 5, 3
VM2
9 VM1.1 12
17
P1: 2, 1
VM2: 12, 5
物理メモリ空間
プロセスP1
次にマップ合成機構は
VMID = 1.1 なので VM1 の f の VM1 を見に行く
f1(2) = 7
そして仮の VMID を 1 とする
Hardware Virtualizer による
再帰的 VM システムの例
VM1
0
4
VM1: 4, 8
VM1: 5, 3
VM2
9 VM1.1 12
17
P1: 2, 1
VM2: 12, 5
物理メモリ空間
プロセスP1
最後にマップ合成機構は
仮のVMID = 1 なのでオリジナルの f のVM1を見に行く
f (7) = 11
Hardware Virtualizer による
再帰的 VM システムの例
VM1
0
4
VM1: 4, 8
VM2
9 VM1.1 12
VM1: 5, 3
17
P1: 2, 1
VM2: 12, 5
もしこのプロセス P1 が
アドレス 3 にアクセスすると…
(例: load 3)
物理メモリ空間
プロセスP1
Hardware Virtualizer による
再帰的 VM システムの例
VM1
0
4
VM1: 4, 8
VM1: 5, 3
VM2
9 VM1.1 12
17
P1: 2, 1
VM2: 12, 5
物理メモリ空間
プロセスP1
まずマップ合成機構は
φを見に行くが、
φ(3) = 未定義 (セグメントサイズを超えている)
よって VM1.1 で実行中の OS にセグメント例外を投げる
Hardware Virtualizer による
再帰的 VM システムの例
VM1
0
4
VM1: 4, 8
VM1: 5, 3
VM2
9 VM1.1 12
17
P1: 2, 5
VM2: 12, 5
物理メモリ空間
プロセスP1
もしφのセグメントサイズが
VM1.1 のサイズをこのように超えているとき
プロセス P1 がアドレス 3にアクセスすると…
Hardware Virtualizer による
再帰的 VM システムの例
VM1
0
4
VM1: 4, 8
VM1: 5, 3
VM2
9 VM1.1 12
17
P1: 2, 5
VM2: 12, 5
まずマップ合成機構は
φを見に行く
φ(3) = 5
物理メモリ空間
プロセスP1
Hardware Virtualizer による
再帰的 VM システムの例
VM1
0
4
VM1: 4, 8
VM1: 5, 3
VM2
9 VM1.1 12
17
P1: 2, 5
VM2: 12, 5
物理メモリ空間
プロセスP1
次にマップ合成機構は
VMID = 1.1 なので VM1 の f の VM1 を見に行くが
f1(5) = 未定義 (セグメントサイズを超えている)
よって VM1 にセグメント例外を投げる