仮想メモリ

TLBとかMMUとかページテーブルとか.
9
Ogata Yasuhiko @yogata

みてる: oza_x86 「仮想マシン上におけるメモリの仮想化について for x86」1/4 - YouTube - https://t.co/6JRNHweN!

2012-09-27 16:18:22
Ogata Yasuhiko @yogata

TLBの探索ってどうやるんだろう.ハッシュ?シーケンシャルに探索?あとページテーブルってどこにあるんだろう.SDRAM上なのかな.

2012-09-27 16:19:53
鯉江 @koie

@yogata TLB自体はHWでCAMかなぁ。ページテーブルはメインメモリ上でCPUが勝手にやったりカーネルがやったり石によってちがうようです。

2012-09-27 16:23:39
Ogata Yasuhiko @yogata

@koie なるほど!CAMだと1クロックで探索できるので高速ですね.ハッシュだと衝突した時を考えなきゃとか,シーケンシャル・探索木だと複数メモリアクセスなので遅そう,……とか思ってました.ページテーブルの位置は色々なのですね.ありがとうございます!

2012-09-27 16:26:33
Ogata Yasuhiko @yogata

ゲストOSはページテーブルは見ないのか.Pre-validationだと,CR3へのアクセスをフックしてホストOSのSPTにアクセスさせるのかー.なるほど,すごい.

2012-09-27 16:31:34
Ogata Yasuhiko @yogata

ホストOS「おめーのCR3,自分で作ったページテーブルみてねーから!」

2012-09-27 16:32:14
イスラエルエリカちゃん #StayAtHome @syuu1228

@yogata @koie ページテーブルの位置はメインメモリ上です。ページテーブルの読み書きを行う主体がCPUであるアーキテクチャと、カーネルが勝手にやれというアーキテクチャがあります

2012-09-27 16:33:54
イスラエルエリカちゃん #StayAtHome @syuu1228

@yogata このあたり、来月のSDにちょろっと書きます…解説の量的にはoza_x86氏やhasegaw氏のプレゼンの方が充実してるやもしれませんが

2012-09-27 16:35:22
Ogata Yasuhiko @yogata

@syuu1228 @koie ありがとうございます!メインメモリ上なんですね.ポインタ(CR3)がレジスタ上にあるとあったので,テーブル自体もCPU上に乗っているのかな?でもサイズ的に無理じゃね?と思ってました.

2012-09-27 16:35:39
イスラエルエリカちゃん #StayAtHome @syuu1228

@yogata @koie サイズ的に無理なので、頻出の数十エントリだけTLBにおいて(キャッシュ)CAMで素早くアクセスします。

2012-09-27 16:37:10
Ogata Yasuhiko @yogata

@syuu1228 @koie 理解しました.ありがとうございます!! TLBは,CAMで探索してページテーブルはCPU上のSRAMに保持.キャッシュに引っかからないページテーブルはCR3が示すメインメモリ上に保持.ってことですね.

2012-09-27 16:40:49
イスラエルエリカちゃん #StayAtHome @syuu1228

@yogata x86的にはTLBになかったらCR3のページテーブルから引いてきてTLBに載せる、とかやるはずっす(カーネルは介在しない)。条件によって、カーネルからTLBをフラッシュしないといけないパターンとか出てくる事もあって、その為の命令とかあります

2012-09-27 16:44:46
イスラエルエリカちゃん #StayAtHome @syuu1228

疑問:x86のTLBフラッシュは完全に手動?何かの命令に伴ってフラッシュされる事とかあるのかな

2012-09-27 16:45:55
Ogata Yasuhiko @yogata

@syuu1228 TLBをフラッシュしないといけない場合ってのがあるんですか……

2012-09-27 16:47:35
Ogata Yasuhiko @yogata

@syuu1228 プロセスごとにページテーブルを持っているので,プロセススイッチした時にTLBをフラッシュして次のプロセス用に更新するやり方だと,TLBフラッシュが必要かもですね http://t.co/2KkWJtTi

2012-09-27 16:53:00
Ogata Yasuhiko @yogata

ページテーブルはプロセスごとに作るので,適切なTLBを維持する方法の1つとして,プロセススイッチに伴ってページテーブルも切り替える方式があるらしい「プロセススイッチ時に TLB をフラッシュすることで、仮想アドレスの衝突を解決している。 」http://t.co/2KkWJtTi

2012-09-27 16:54:17
Ogata Yasuhiko @yogata

読み間違えたかも.ページテーブルを切り替えるんじゃなくて,消してまっさらにする,ってことかな.切り替えるなら前の情報を保持しないといけないし.

2012-09-27 16:55:35
イスラエルエリカちゃん #StayAtHome @syuu1228

@yogata Tagged TLB(TLBエントリにプロセス識別子を持つ)でない限り、プロセスをスイッチする時にTLB全フラッシュが必要なはずです。あと、ページテーブルエントリを書き換えてしまった時とかにも必要になるはずじゃないかな

2012-09-27 17:00:58
イスラエルエリカちゃん #StayAtHome @syuu1228

TLBの呪いを受けて死ぬとかもうやりたくないですね…(しろめ

2012-09-27 17:01:45
Ogata Yasuhiko @yogata

@syuu1228 おー,なるほど,確かに.TLBの作り方を工夫してプロセス識別を仕込んだり,そもそもエントリ変わった場合はフラッシュ必須ですね.

2012-09-27 17:02:42
イスラエルエリカちゃん #StayAtHome @syuu1228

@yogata 最近のIntelだと仮想マシンIDがTLBエントリに仕込めたり。

2012-09-27 17:03:28