- 通常のメモリのページは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から構成される