Linux 內(nèi)核中,一個(gè) folio 可以只包含 1 個(gè) page,也可以包含多個(gè) page。當(dāng)一個(gè) folio 包含多個(gè) page 的時(shí)候,我們稱它為一個(gè) large folio,在中文社區(qū),我們一般稱呼其為大頁。采用 large folio 可潛在帶來諸多好處,比如:
1. TLB miss 減小,比如許多硬件都支持 PMD 映射,可以直接把 2MB 做成一個(gè) large folio,只占用一個(gè) TLB entry;部分硬件支持 contiguous PTE 映射,比如 ARM64 可以讓 16 個(gè)連續(xù)的 page 通過 CONT-PTE 只占一個(gè) TLB entry。
2. page fault 次數(shù)減小,比如 do_anonymous_page() 在某個(gè) PTE 的 page fault 后,直接申請一個(gè) large folio 并映射一個(gè) CONT-PTE 的話,則剩下的 15 個(gè) PTE 不再發(fā)生 page fault。
3. 降低 LRU 的規(guī)模和內(nèi)存 reclamation 的成本,以 large folio 為單位進(jìn)行回收,整個(gè) large folio 在 folio_referenced() 等的反向映射成本低于多個(gè) small folio 單獨(dú)進(jìn)行 rmap 的成本;try_to_unmap_one() 理論上也如此。
4. 潛在的以更大粒度在 zRAM/zsmalloc 進(jìn)行壓縮/解壓的機(jī)會(huì),從而降低壓縮/解壓的 CPU 利用率、提高壓縮率。比如 64KiB 的 large folio 整體壓縮,比分成 16個(gè)4KiB 的 small folio 來進(jìn)行壓縮,有明顯優(yōu)勢。
在 Linux 內(nèi)核的整個(gè)內(nèi)存管理中,large folios 將與 small folios(只有一個(gè)page)混合存在。比如在 LRU 鏈表上,掛在上面的 folio 既可能是 large,也可能是 small;一個(gè)進(jìn)程的某個(gè) VMA 里面的內(nèi)存,可由 large folios 和 small folios 混合組成;文件的 pagecache 上,不同的 offset 上面對應(yīng)的可能是 small folios 也可能是 large folios。

