Memory Virtualization

Preview:

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日月曜日

Recommended