- 通常のメモリのページは4KB(x86_64, Linux)
- 4KBを超えるページを、[[Linux]]ではHuge pageと呼ぶ
- 4KB以上のメモリを触るとき、毎回[[TLB]]→キャッシュミス→Page walkをしていたら遅いので、より大きなページサイズを確保したい
- そこで、Page walk中にPSE bitが立っていれば、そのエントリのアドレスをhuge pageとして扱い、残りの仮想アドレス部分はページ内のオフセットとして使う、という仕組み
- 4KBページ: [[PGD]]→PUD→PMD→PTE→物理ページ(4段)
- 2MB Hugepage: PGD→PUD→PMD(PSE=1)→物理ページ(3段)
- 仮想アドレスのオフセットは$2^{(9+12)}=2\mathrm{MB}$
- 1GB hugepage: PGD→PUD(PSE=1)→物理ページ(2段)
- これでめっちゃ[[TLB]]に載るようになるし(単純に2MBに512エントリ必要だったのが1エントリになる)、ウォーク回数が少なくなる
- [[Compound Page]]: Hugepageを実現するために、[[Linux]]カーネルは複数の[[struct page]]を一まとまりにする
- `[head page] [tail page] [tail page] ... [tail page]`
- 2MBのHuge pageは、1つのhead pageと511のtail pageから構成される