実装の概要

Download Report

Transcript 実装の概要

全体ミーティング
金田憲二
1
Agenda
Progress Report
 Survey

1 paper from USENIX Virtual Machine
Research and Technology (VM’04)
 5 papers from USENIX Operating Systems
and Design and Implementation (OSDI’04)
※ OSDIではセキュリティ関係の話が多かった

2
Progress Report
3
何を作っているか

分散した複数の計算機上に
並列計算機を仮想的に構築するシステム
Processor
Processor
Memory
virtual
physical
Processor
Processor
Memory
Network
Memory
4
何がうれしいか

分散資源を簡便に利用することができる
例)ゲストOS のスケジューラーが、個々の計算機に
プロセスを割り振ってくれる
プロセス
プロセス
プロセス
プロセス
5
現在の実装状況

2種類の方式で実装している

Full-virtualization (いわゆるCPU emulator)
 Bochs [http://bochs.sourceforge.net]を改造

Para-virtualization (いわゆるVMWare型)
 スクラッチから実装
※ IA-32上でIA-32を仮想化
ホストOS、ゲストOS共にLinux
6
Full-virtualizationによる実装

一応ブートするところまでいった


ところどころ動作がおかしい(遅い)
原因は?

Tickなどのエミュレーションが不十分なため?
 各仮想CPUにおいて、tickの経過速度が異なる
 HLT命令を発行しても少しの間しか止まらない
7
Para-virtualizationによる実装

ブートの途中でおかしくなる
start_kernel() {
printk(linux_banner);
setup_arch();
parse_options();
trap_init();
init_IRQ();
sched_init();
softrq_init();
time_init();
console_init();
kmem_cache_init();
…
…
console_init();
kmem_cache_init();
mem_init();
kmem_cache_size_init();
pgtable_cache_init();
fork_init();
proc_cache_init();
vfs_cache_init();
buffer_init();
signals_init();
smp_init();
8
rest_init();
ここまで
}
残りの発表の流れ

Para-virtualizationによるVMの実装
シングルプロセッサマシンの場合
 マルチプロセッサマシンの場合

9
シングルプロセッサの場合の
VMの実装
• 実装の概要
• 特権命令のエミュレーション
• アドレス空間のエミュレーション
10
シングルプロセッサの場合の
VMの実装
• 実装の概要
• 特権命令のエミュレーション
• アドレス空間のエミュレーション
11
VMの実装の概要
基本的にはゲストOSのコードをNativeに実行
 必要に応じてハードウェアをエミュレーション

特権命令
 アドレス空間
 デバイス
…

12
シングルプロセッサの場合の
VMの実装
• 実装の概要
• 特権命令のエミュレーション
• アドレス空間のエミュレーション
13
特権命令とは

CPUが特権レベルでないと実行できない命令
例)in命令、out命令
 I/Oポートとの入出力
例)mov cr3命令
 ページディレクトリの物理アドレスの設定
例)invtlb命令
 TLBのフラッシュ

実ハードウェアに影響する命令なので、
ソフトウェアでエミュレーションする必要がある
14
特権命令のエミュレーション
の概要

特権命令の実行直前にシグナルが発生する
ようにする


カーネルのソースコードをコンパイル時に変換
そのシグナルを捕捉することにより、
Native実行とエミュレーション実行を切り替える
15
特権命令のエミュレーション
の詳細 (1/5)

以下の2つのプロセスを用意する

VMプロセス
 ゲストOSのコードをNativeに実行する

モニタプロセス
 VMプロセスを監視する
VMプロセス
監視
モニタプロセス
16
特権命令のエミュレーション
の詳細 (1/5)
1. カーネルのコードをコンパイル時に変換
 特権命令の直前にundefined instructionを挿入
※アセンブリからアセンブリへの簡単な変換器を作成
変換前
…
mov %eax,%cr3
…
変換後
…
ud2a
mov %eax,%cr3
…
17
特権命令のエミュレーション
の詳細 (3/5)
2. VMプロセスがundefined instructionを実行
 シグナルが発生する
…
ud2a
mov %eax,%cr3
…
シグナル
VMプロセス
監視
モニタプロセス
18
特権命令のエミュレーション
の詳細 (4/5)
3. 発生したシグナルをモニタプロセスが補足
 ptraceシステムコールを利用
…
ud2a
mov %eax,%cr3
…
シグナル
VMプロセス
監視
モニタプロセス
19
特権命令のエミュレーション
の詳細 (5/5)
4. 命令をデコードし、ソフトウェアで
エミュレーション実行
…
ud2a
mov %eax,%cr3
…
0f 0b
VMプロセス
0f 22 d8
監視
モニタプロセス
20
シングルプロセッサの場合の
VMの実装
• 実装の概要
• 特権命令のエミュレーション
• アドレス空間のエミュレーション
21
アドレス空間のエミュレーションに
おける問題

ゲストOSのカーネル領域の配置
デフォルトだと、ホストのカーネル領域と同じ領域を
確保しようとする
 ホストOSのユーザ領域中に確保する必要がある

Linuxの仮想アドレス空間
0
0xc000000
ユーザ領域
0xffffffff
カーネル領域
22
アドレス空間のエミュレーション (1/2)

ゲストOSのコードを改変しカーネル領域をずらす

エミュレーションのための領域も確保する
ゲストOSの
ユーザ領域
ゲストOSの
エミュレーションのための領域
カーネル領域 (ゲストOSの物理メモリの状態を保持)
0
0xc000000
ホストOSのユーザ領域
0xffffffff
ホストOSのカーネル領域
23
アドレス空間のエミュレーション (2/2)

ゲストOSのページテーブルを参照して、ゲストOSの物理
メモリと、ゲストOSのユーザ・カーネル領域を対応付ける

mmapシステムコールを利用
ゲストOSの
ユーザ領域
0
ゲストOSの
エミュレーションのための領域
カーネル領域 (ゲストOSの物理メモリの状態を保持)
0xc000000
0xffffffff
24
マルチプロセッサの場合の
VMの実装
• 実装の概要
• 共有メモリのエミュレーション
• プロセッサ間割り込みのエミュレーション
25
マルチプロセッサの場合の
VMの実装
• 実装の概要
• 共有メモリのエミュレーション
• プロセッサ間割り込みのエミュレーション
26
実装の概要 (1/2)

個々のプロセッサを別々のマシンがエミュレーション
Processor
Processor
Memory
virtual
physical
Processor
Processor
Memory
Network
Memory
27
実装の概要 (2/2)

シングルプロセッサマシンの場合と比べ
共有メモリ
 プロセッサ間割り込み
のエミュレーションがさらに必要になる

28
マルチプロセッサの場合の
VMの実装
• 実装の概要
• 共有メモリのエミュレーション
• 概要
• IA-32のメモリモデル
• 実装方式
• プロセッサ間割り込みのエミュレーション
29
共有メモリのエミュレーション

通常のソフトウェアDSMの実装とほぼ同様


OSの提供するページ保護機構を利用
ただし、IA-32のメモリモデルを満たす必要がある
Processor
Processor
write
Memory
virtual
physical
Processor
Comm.
read
Processor
write
read
Memory
Memory
30
マルチプロセッサの場合の
VMの実装
• 実装の概要
• 共有メモリのエミュレーション
• 概要
• IA-32のメモリモデル
• 実装方式
• プロセッサ間割り込みのエミュレーション
31
IA-32のメモリモデル
あるPUから見えるメモリの状態と、別のPUから
見えるメモリの状態とは、必ずしも一致しない
 ただし以下の制約を満たす

Processor consistency
 Write atomicity

アドレス0x1000の値は0
アドレス0x1000の値は1
Processor
Processor
Memory
32
Processor Consistency (1/2)

あるプロセッサが行った書き込みは,
同一プロセッサには,すぐに反映される
 異なるプロセッサには,遅れて反映されうる

PU1
write X to p
X
?
read from p
=
=
read from p
=
read from p
PU2
33
X
Processor Consistency (2/2)

あるプロセッサが行った書き込みは,
同じ順序でリモートプロセッサに反映される
PU1
write X to p
PU2
PU3
write Y to q
write Z to r
34
Processor Consistency (3/3)

直列化命令
E.g.) mfence命令
 書き込みがリモートプロセッサに反映されたことを保障
PU1
PU2
PU3
write X to p
write Y to q
write Z to r
mfence
35
Write Atomicity

書き込みはリモートプロセッサにatomicに
反映される
PU1
write X to p
PU2
PU3
(アドレスpに対する)
読み書きは,この間に
発生しない
36
マルチプロセッサの場合の
VMの実装
• 実装の概要
• 共有メモリのエミュレーション
• 概要
• IA-32のメモリモデル
• 実現方式
• プロセッサ間割り込みのエミュレーション
37
Processor Consistencyの保障
(1/4)

直列化命令実行時に,ローカルの書き込み
結果を他の全てのマシンに反映させる
PU1
Write X to p
PU2
Write Y to q
Write Z to r
mfence
p, q, rへの書き込み
結果を送信
書き込み結果を
反映
38
Processor Consistencyの保障
(2/4)
1. 全てのページを書き込み禁止にする
 mprotectシステムコールを利用
PC1
Twins
Memory
PC2
Memory
Write X to p
Write Y to q
Write Z to r
mfence
…
39
Processor Consistencyの保障
(3/4)
2. ページに対して書き込みがあると
 そのページのコピー(= twin)を作成する
 そのページへの書き込みを許可する
PC1
PC2
Twins
Memory
Memory
Write X to p
Write Y to q
Write Z to r
mfence
p
X
q
Y
r
Z
…
40
Processor Consistencyの保障
(4/4)
3. 直列化命令を実行する時に,
 twinと現在のメモリを比較してdiffを作成する
 diffをリモートマシンに送信する
PC1
PC2
Twins
Memory
Memory
Write X to p
Write Y to q
Write Z to r
mfence
p
X
q
Y
r
Z
…
41
Write Atomicityの保障

省略

各ページにownerなどを導入することにより実現
42
マルチプロセッサの場合の
VMの実装
• 実装の概要
• 共有メモリのエミュレーション
• プロセッサ間割り込みのエミュレーション
43
プロセッサ間割り込みとは

リモートプロセッサで割り込みを発生する機構
例)TLBのフラッシュ要求、CPUの起動要求
 APICというハードウェアにより実現されている
44
プロセッサ間割り込みの
エミュレーション

APICのmapされた物理アドレス領域への
読み書きを捕捉し、エミュレーションする
例)物理アドレス0xee00020への読み込み
 APICのIDを返す
例)物理アドレス0xee0300への書き込み
 プロセッサ間割り込みを発生
45
まとめと今後の課題
46
まとめ

分散した複数の計算機上に
並列計算機を仮想的に構築するシステム
47
今後の課題
実装の完成(10月中?)
 性能評価

48