在 x86 架構上,「擴充分頁」允許頁幀(實體記憶體)為 4 MB,而不是 4 KB。
《Understanding the Linux Kernel, 3rd》一書的第 2 章「記憶體定址」、「Linux 中的分頁」子章、「核心頁表」部分解釋了當 RAM 大小小於 896 MB 時,對於最終核心頁表:
[...]核心可以透過使用大頁面來尋址 RAM(請參閱本章前面的「擴充分頁」部分)。
然而,在「擴展分頁」部分(「硬體分頁」子章)中,寫道:
擴展尋呼與常規尋呼共存。
我實際上不明白擴展和常規尋呼如何共存。能否請有人解釋一下這些問題:
- 在什麼情況下核心使用 4 MB 頁面?或 4 KB 頁面?
- kmalloc 操作將使用哪個頁框大小?對於vmalloc?
- 如果我們假設初始程式碼和資料(核心段、臨時頁表和 128 KB 的動態資料)適合前 8 MB RAM(如本書給出的範例),那麼實際的程式碼量和資料量會怎樣? :核心會浪費8 - 5 = 3 MB 嗎?
答案1
1. 核心在什麼情況下使用 4 MB 頁?或 4 KB 頁面?
應用程式可以申請大頁,核心不會確定頁大小,除非將PAGE_SIZE編譯到核心原始碼。使用 mmap 標誌可以決定應用程式原始碼中的頁面大小。
2. kmalloc 操作將使用哪個頁框大小?對於vmalloc?
kmalloc使用Linux核心中的預設頁大小,即核心中的PAGE_SIZE,它是編譯或執行時決定的。 vmalloc 也是一樣。
3. 如果我們假設初始程式碼和資料(核心的段、臨時頁表和 128 KB 的動態資料)適合前 8 MB RAM(如本書給出的範例),那麼如果實際的數量會怎樣呢?資料只有5MB:核心會浪費8 - 5 = 3 MB 嗎?
浪費記憶體的大小由PAGE_SIZE和資料決定,如果頁面大小為4MB,資料為5MB,則浪費的記憶體大小將為(PAGE_SIZE*N) - 5MB= 3MB。