Upload
tsuyoshi-ozawa
View
3.266
Download
3
Embed Size (px)
Citation preview
カーネル/VM探検隊第二回Tsuyoshi OzawaTwitter oza_x86
12009年11月9日月曜日
はじめに
22009年11月9日月曜日
32009年11月9日月曜日
コレ!
42009年11月9日月曜日
誤報です
52009年11月9日月曜日
KVMの内容ないです
62009年11月9日月曜日
今日の内容
仮想マシン上における
メモリの仮想化について
for x86
72009年11月9日月曜日
そもそも仮想化とは
使い手(=OS)から実物と同じに見える
Linux on Real Machine Linux on Virtual Machine
82009年11月9日月曜日
実物を知ろう
92009年11月9日月曜日
実機の仮想アドレスの仕組み
x86 実機におけるお話をします
その後で仮想化(Shadow Page Table)の話
102009年11月9日月曜日
仮想メモリの概要
CPU
PhysicalMemory
VirtualMemory
仮想アドレス 物理アドレス
0x1000 0x11000
0x2000 0x12000
... ...
112009年11月9日月曜日
仮想メモリの利点
• 物理メモリより多くのメモリが使える
• プロセス毎にメモリを管理するので、より安全にプロセスが動作
122009年11月9日月曜日
仮想メモリの実現のために必要な
管理情報
• ページテーブル
• メモリアクセスの履歴
132009年11月9日月曜日
ページテーブル
• OSが管理
• バイナリの構造体
• 仮想アドレスを物理アドレスに変換する「表」
仮想アドレス 物理アドレス
0x1000 0x11000
0x2000 0x12000
... ...
142009年11月9日月曜日
ページテーブルの特徴• ページテーブルはプロセスの数だけある
• OSは参照するページテーブルを切り替えながら実行
仮想アドレス 物理アドレス
0x1000 0x11000
0x2000 0x12000
... ...
152009年11月9日月曜日
メモリアクセスの履歴• いつ、どのくらいの頻度でそのアドレスにアクセス?
• スワップイン・スワップアウトに利用
PhysicalMemory
swap inswap out
162009年11月9日月曜日
仮想メモリの実現に使われている
ハードウェア1. ページテーブルの場所を格納するレジスタ CR3
2. アドレス変換を行う MMU
3. キャッシュ TLB CPU
x86の場合はCPU上に載っている MMU
CR3
TLB
172009年11月9日月曜日
ページテーブルの場所を格納するレジスタ
• ページテーブルのアドレスを格納する
• Control Register の 3 番目
CR3
182009年11月9日月曜日
アドレス変換を行うハードウェア
• ページテーブルのエントリを解釈して、物理アドレスへ変換を行う
• Memory Management Unit
MMU
192009年11月9日月曜日
変換のキャッシュ
• Translation Look-aside Buffer
• メモリアクセスの度にページテーブルにアクセスすると遅い メモリアクセスの度にページテーブルへのメモリアクセスが生じる
• CPU内のSRAMに保存しておく
TLB
202009年11月9日月曜日
アドレス変換の仕組み
CR3
TLB
Virtual Address 0xc000312012bit20bit
ページテーブル
PhysicalMemory
1.TLBを見る
2.ページテーブルを参照
3.何番目のページか求める
4.オフセットを計算してアクセス
MMU
実際には3段ページングというのもある
212009年11月9日月曜日
ここまで実物の話
222009年11月9日月曜日
ここからVMの
メモリ仮想化の話
232009年11月9日月曜日
の前に
242009年11月9日月曜日
VMの概要について
252009年11月9日月曜日
VMの概要
• OSが動作できる環境を提供する
262009年11月9日月曜日
VMを管理するための
ソフトウェア
Virtual Machine Monitor
VMM
Hardware
272009年11月9日月曜日
VMMの種類
• 大雑把に分けて3種類のVMMが存在
• Robert P. Goldberg. ,Architectural Principles for Virtual Computer Systems.
282009年11月9日月曜日
Type I VMM
• ハードウェアを直接制御
• Xen, VMware ESX
VMM
Hardware
292009年11月9日月曜日
Type II VMM
• OS 上で動作するプロセスとして動作
• QemuLilyVMBochs
VMM
Hardware
OS
Proc
302009年11月9日月曜日
Hybrid 型 VMM
• Type I + Type II
• 現在の主流
• VMware WorkstationLinux KVM VMM
Hardware
OS
VMMProc
312009年11月9日月曜日
Hybrid 型 VMM
• コレの話がメイン
VMMHardware
OS
VMM
322009年11月9日月曜日
ようやくVMの
メモリ仮想化の話
332009年11月9日月曜日
2つの仮想化の手法
• Shadow Page Table ( SPT )ソフトウェアのみで実装
• Nested Page Table (Extended Page Table)ハードウェアの支援が必要
342009年11月9日月曜日
Shadow Page Table
• ゲストOSのページテーブルの Shadow をホストOS側で作る
• ゲストOSは Shadow を見て動作
352009年11月9日月曜日
SPTの概要
VMMHardware
OS
Hybrid 型VMMで説明します!
362009年11月9日月曜日
SPTの概要
VMMHardware
OS
CR3TLB
Guest side
Host side
VMvCR3vTLB
372009年11月9日月曜日
SPTの概要
VMMHardware
OS
CR3TLB
Guest side
Host side
VMvCR3vTLB
Guestpage table
create page table
382009年11月9日月曜日
SPTの概要
VMMHardware
OS
CR3TLB
Guest side
Host side
VMvCR3vTLB
Guestpage table
何らかのタイミングで...
392009年11月9日月曜日
SPTの概要
VMMHardware
OS
CR3TLB
Guest side
Host side
VMvCR3vTLB
Guestpage table
VMMに処理を渡す
402009年11月9日月曜日
SPTの概要
VMMHardware
OS
CR3TLB
Guest side
Host side
VMvCR3vTLB
Guestpage table
VMMはゲストPT を見る
412009年11月9日月曜日
SPTの概要
VMMHardware
OS
CR3TLB
Guest side
Host side
VMvCR3vTLB
Guestpage table
Shadowpage table
create SPT
422009年11月9日月曜日
HostPhysicalMemory
GuestPhysicalMemory
SPTでのメモリアクセス
VMMHardware
CR3TLB
OSVM
vCR3vTLB
Guestpage table
Shadowpage table
ゲストOSがvCR3
に書き込み
432009年11月9日月曜日
HostPhysicalMemory
GuestPhysicalMemory
SPTでのメモリアクセス
VMMHardware
CR3TLB
OSVM
vCR3vTLB
Guestpage table
Shadowpage table
HookしてVMMに処理が移る
442009年11月9日月曜日
HostPhysicalMemory
GuestPhysicalMemory
SPTでのメモリアクセス
VMMHardware
CR3TLB
OSVM
vCR3vTLB
Guestpage table
Shadowpage table
作ったSPTを実機CR3にロード
452009年11月9日月曜日
これでメモリアクセスが発生すると
462009年11月9日月曜日
SPTでのメモリアクセス
VMMHardware
CR3TLB
OSVM
vCR3vTLB
Guestpage table
Shadowpage table Host
PhysicalMemory
GuestPhysicalMemory
472009年11月9日月曜日
SPTでのメモリアクセス
VMMHardware
CR3TLB
OSVM
vCR3vTLB
Guestpage table
Shadowpage table Host
PhysicalMemory
GuestPhysicalMemory
ゲストの視点
482009年11月9日月曜日
SPTでのメモリアクセス
VMMHardware
CR3TLB
OSVM
vCR3vTLB
Guestpage table
Shadowpage table Host
PhysicalMemory
GuestPhysicalMemory
現実
492009年11月9日月曜日
SPTの動作のポイント
• ゲストOSの作ったページテーブルは
メモリアクセス時に見ない• VMMが作ったSPTを見て動作
502009年11月9日月曜日
SPTの実装
• Pre-Validation
• Virtual TLB
• Virtual TLB + Memory Trace
512009年11月9日月曜日
Pre-validation
• CR3 への書き込みをフック
• ゲストの作ったPTを見る
• SPTを全て再構築
522009年11月9日月曜日
Pre-validation
VMMHardware
OS
CR3TLB
Guest side
Host side
VMvCR3vTLB
Guestpage table
create page table
532009年11月9日月曜日
Pre-validation
VMMHardware
OS
CR3TLB
Guest side
Host side
VMvCR3vTLB
Guestpage table
ゲストOSは勝手にPTを作る
542009年11月9日月曜日
Pre-validation
VMMHardware
OS
CR3TLB
Guest side
Host side
VMvCR3vTLB
Guestpage table
CR3への書き込みをフック
552009年11月9日月曜日
Pre-validation
VMMHardware
OS
CR3TLB
Guest side
Host side
VMvCR3vTLB
Guestpage table
VMMに処理を渡す
562009年11月9日月曜日
Pre-validation
VMMHardware
OS
CR3TLB
Guest side
Host side
VMvCR3vTLB
Guestpage table
VMMはゲストPT を見る
572009年11月9日月曜日
Pre-validation
VMMHardware
OS
CR3TLB
Guest side
Host side
VMvCR3vTLB
Guestpage table
Shadowpage table
create SPT
582009年11月9日月曜日
HostPhysicalMemory
GuestPhysicalMemory
Pre-validation
VMMHardware
CR3TLB
OSVM
vCR3vTLB
Guestpage table
Shadowpage table
作ったSPTを実機CR3にロード
592009年11月9日月曜日
SPTでのメモリアクセス
VMMHardware
CR3TLB
OSVM
vCR3vTLB
Guestpage table
Shadowpage table Host
PhysicalMemory
GuestPhysicalMemory
SPTを見てアクセス
602009年11月9日月曜日
Pre-validationの欠点• プロセス切り替え毎
( CR3 への書き込み毎 ) にSPTを
全て再構築• コンテキストスイッチのオーバヘッドが非常に大きくなる
612009年11月9日月曜日
Virtual TLB
• CR3 に書き込みがあったらSPTの1段目だけを作る
• 残りはTLBミスが起きたところでSPTを作る
• TLBミスが起こると、それを補う「キャッシュ」をVMMが追加
622009年11月9日月曜日
Virtual TLB
VMMHardware
OS
CR3TLB
Guest side
Host side
VMvCR3vTLB
Guestpage table
create page table
632009年11月9日月曜日
Virtual TLB
VMMHardware
OS
CR3TLB
Guest side
Host side
VMvCR3vTLB
Guestpage table
ゲストOSは勝手にPTを作る
642009年11月9日月曜日
Virtual TLB
VMMHardware
OS
CR3TLB
Guest side
Host side
VMvCR3vTLB
Guestpage table
CR3への書き込みをフック
652009年11月9日月曜日
Virtual TLB
VMMHardware
OS
CR3TLB
Guest side
Host side
VMvCR3vTLB
Guestpage table
VMMに処理を渡す
662009年11月9日月曜日
Virtual TLB
VMMHardware
OS
CR3TLB
Guest side
Host side
VMvCR3vTLB
Guestpage table
VMMはゲストPT を見る
672009年11月9日月曜日
Virtual TLB
VMMHardware
OS
CR3TLB
Guest side
Host side
VMvCR3vTLB
Guestpage table
Shadowpage table1st stage
create SPT
682009年11月9日月曜日
Virtual TLB
VMMHardware
OS
CR3TLB
Guest side
Host side
VMvCR3vTLB
Guestpage table
Shadowpage table1st stage
create SPT
VMMはページテーブル
1段目のみを作成
692009年11月9日月曜日
HostPhysicalMemory
GuestPhysicalMemory
Virtual TLB
VMMHardware
CR3TLB
OSVM
vCR3vTLB
Guestpage table
Shadowpage table1st stage
作ったSPTを実機CR3にロード
702009年11月9日月曜日
Virtual TLBでのメモリアクセス
VMMHardware
CR3TLB
OSVM
vCR3vTLB
Guestpage table
Shadowpage table1st stage
HostPhysicalMemory
GuestPhysicalMemory
712009年11月9日月曜日
Virtual TLBでのメモリアクセス
VMMHardware
CR3TLB
OSVM
vCR3vTLB
Guestpage table
Shadowpage table1st stage
HostPhysicalMemory
GuestPhysicalMemory
ページフォールト
722009年11月9日月曜日
Virtual TLBでのメモリアクセス
VMMHardware
CR3TLB
OSVM
vCR3vTLB
Guestpage table
Shadowpage table1st stage
HostPhysicalMemory
GuestPhysicalMemory
ページフォールトハンドラ起動
732009年11月9日月曜日
Virtual TLBでのメモリアクセス
VMMHardware
CR3TLB
OSVM
vCR3vTLB
Guestpage table
Shadowpage table1st stage
HostPhysicalMemory
GuestPhysicalMemory
VMMはゲストPT を見る
742009年11月9日月曜日
Virtual TLBでのメモリアクセス
VMMHardware
CR3TLB
OSVM
vCR3vTLB
Guestpage table
Shadowpage table
2nd stageHost
PhysicalMemory
GuestPhysicalMemory
2段目のページテーブル埋まる
752009年11月9日月曜日
Virtual TLBでのメモリアクセス
VMMHardware
CR3TLB
OSVM
vCR3vTLB
Guestpage table
Shadowpage table
2nd stageHost
PhysicalMemory
GuestPhysicalMemory
この瞬間表が完成!
(注)ページテーブルの段数はCPUモード固有762009年11月9日月曜日
Virtual TLBでのメモリアクセス
VMMHardware
CR3TLB
OSVM
vCR3vTLB
Guestpage table
Shadowpage table
2nd stageHost
PhysicalMemory
GuestPhysicalMemory
ゲストOS
メモリアクセス再開
(注)ページテーブルの段数はCPUモード固有772009年11月9日月曜日
Virtual TLBでのメモリアクセス
VMMHardware
CR3TLB
OSVM
vCR3vTLB
Guestpage table
Shadowpage table
2nd stageHost
PhysicalMemory
GuestPhysicalMemory
ページがひけて無事アクセスできる
(注)ページテーブルの段数はCPUモード固有782009年11月9日月曜日
Virtual TLBの問題
• 整合性を保つのにひと工夫必要
• ページテーブルを変更したとき
• ページテーブルを追加したとき
• 作ったSPTは、結局吹き飛ばす
792009年11月9日月曜日
Virtual TLBにおけるフックポイントまとめ
• TLBが無効になったとき
• CR3 に書き込んだとき
• invlpg 命令が発効されたとき
• ゲストOSのコンテキストでページフォールトが生じたとき
• メモリへのアクセス保護例外が発生したとき(PTE変更への対処)
802009年11月9日月曜日
SPTを長生きさせるには
• TLBフラッシュが起きたときにSPTを吹き飛ばさないようにする
• ゲストOSの作ったPTとSPTの整合性がとれていれば可能
812009年11月9日月曜日
Memory Trace
• ゲストOSの作成したPTへのアクセスアクセス保護例外を使ってフック
• ゲストOSで生じたイベントを記録して吹き飛ばすことなくSPTを再現する(Trace)
822009年11月9日月曜日
神は細部に宿り給う• x86特有の問題
• ページテーブルの段数がCPUのモードによって切り替わる
• Linux KVM ではマクロを使ってひな形を用意してコード量を削減
832009年11月9日月曜日
見てみましょう
kvm-88/kernel/x86/paging_tmpl.h
842009年11月9日月曜日
Nested Page Table(Extended Page Table)• ページングの段階をもう一段階増やす
ゲスト仮想アドレス
ゲスト物理アドレス
ホスト物理アドレス
0x1000 0x11000 0x21000
0x2000 0x12000 0x42000
... ...
852009年11月9日月曜日
NPT/EPTの特徴• AMDのCPUではほとんどのCPUでサポートされている
• Intel CPUでは割と最近のCPU(i7以降)で実装された
• VMMの実装がシンプルになる
• SPTより速いとは限らない
862009年11月9日月曜日
まとめ
• VMにおけるメモリの仮想化
• SPT
• Pre-validation
• Virtual TLB
• NPT/EPT
872009年11月9日月曜日