擴展(4MB)和常規(4KB)分頁如何共存?

擴展(4MB)和常規(4KB)分頁如何共存?

在 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。

相關內容