Slide 1

Slide 1 text

仮想アドレスから 物理アドレスには どうやって変換するの? Jun. 13rd, 2024 Satoru Takeuchi X: satoru_takeuchi 1

Slide 2

Slide 2 text

はじめに ● はなすこと ○ 仮想記憶のしくみでは仮想アドレスから物理アドレスにどうやって変換しているか ● 📝 見ておくといい動画 ○ 仮想記憶 ~概念編~ ○ 仮想記憶 ~確認編~ ○ Linuxのメモリ管理入門 プロセスごとに違う世界を見せる仮想記憶 2

Slide 3

Slide 3 text

アドレス変換にはページテーブルという変換表を使う 3 仮想アドレス 0 200 物理メモリ 0 プロセスのメモリ 500 600 100 200 300 400 700 仮想アドレス 物理アドレス 0-100 500-600 100-200 600-700 カーネルのメモリ ページサイズ ページテーブル 100 ページテーブルエントリ 仮想アドレス

Slide 4

Slide 4 text

誰が何を担当するか ● カーネルがプロセスごとにページテーブルを作成 ● CPUがプロセス実行時にメモリアクセスするたびにアドレス変換 ○ カーネルがやってると遅すぎて話にならない ○ 📝 カーネルが出てくる場面もあるが、それはいずれ説明予定 4

Slide 5

Slide 5 text

現実世界のページテーブル: x86_64の場合 ● 全プロセスについて256TiBの仮想アドレス空間がある ○ ページサイズは4KiB ○ ページテーブルエントリのサイズは 8バイト ● 全ページ用のページテーブルエントリの個数は256TiB/4KiB=700億個弱 ○ 1つのプロセスごとに8GiBのページテーブルが必要 ● 疑問 ○ 無駄が多すぎでは? ○ 1つのシステムに数百個のプロセスがあるとするとメモリ足りないのでは ? 5

Slide 6

Slide 6 text

解決策 ● ページテーブルの階層化 ● ページテーブルエントリに存在するpresent bitがある ○ 仮想アドレスが物理アドレスにマップされているかどうかを確認 6

Slide 7

Slide 7 text

● 例: 2階層 階層型ページテーブルのイメージ 7 仮想アドレス present bit 下位のページテーブル 0-400 o 400-800 o 800-1200 x 1200-1600 x 1600-2000 x 2000-2400 x 2400-2800 x 2800-3200 x 仮想アドレス present bit 物理アドレス 0-100 o 400-500 100-200 o 500-600 200-300 o 700-800 300-400 o 1000-1100 仮想アドレス present bit 物理アドレス 400-500 o 1200-1300 500-600 x 600-700 x 700-800 x

Slide 8

Slide 8 text

現実世界のページテーブル: x86_64の場合(続き) ● ページテーブルは4階層 ○ PML4 (Page Map Level 4) ○ PDPT (Page Directory Pointer Table) ○ PD (Page Directory) ○ PT (Page Table) ● ほとんどのプログラムのメモリ使用量は256TiBよりはるかに小さい ○ ページテーブルの容量もそれほど大きくならない 8

Slide 9

Slide 9 text

まとめ ● 仮想記憶では仮想アドレスと物理アドレスはページテーブルで変換している ○ ページテーブルはカーネルメモリに存在 ○ カーネルがページテーブルを用意して、 CPUがアドレス変換する ● 現実世界では仮想アドレス空間はすごく広いが、ページテーブルはそれほど大きく ならない ○ ページテーブルの階層化、ページテーブルの present bitのおかげ ● 📝 プロセスの仮想アドレスがどの物理アドレスに結びついているのかを実際に確 認する動画を後日公開予定 9