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

