關於核心虛擬位址佈局的問題

關於核心虛擬位址佈局的問題

我有兩個關於 x86 和 x64 系統上核心虛擬位址佈局的問題。

據我所知,x86使用的是highmem和lowmem分離的記憶體佈局。

如果我的理解是正確的,highmem 和 lowmem 之間的唯一區別是它是否具有 1:1 虛擬到實體位址映射。

另外,lowmem 似乎包含核心程式經常存取的程式碼和數據,而 highmem 包含不經常存取的頁表或使用者層級程式資料。

但是,我無法理解x86核心分割虛擬位址空間並將經常存取的資料和程式碼定位到lowmem的原因。它有什麼好處呢?似乎無論內核記憶體的位置如何,都應該呼叫頁表遍歷來獲取虛擬到物理的映射。如果正確的話,好像highmem和lowmem沒有什麼優勢。

在這裡,我的第一個問題是,如果lowmem 使用1:1 映射(即實體位址+ 常數(0x80000000)=> 核心虛擬位址),為什麼MMU 花費其時鐘來遍歷頁表以了解虛擬到實體的映射。如果可能的話,我們可以修改MMU邏輯,使其僅從虛擬位址中減去魔術常數即可獲得實體位址(如果它位於lowmem區域)。或者是否有其他原因將經常存取的資料和程式碼放置到 lowmem 中?為什麼只有 lowmem 使用 1:1 映射......?

我的第二個問題是“lowmem和highmem記憶體分割機制也部署在x64 linux系統中嗎?”

先致謝

答案1

進階記憶體低記憶體與 x86 處理器上的實體位址擴充相關。這種機制使處理器能夠尋址 64GB 內存,而不是傳統的 4GB。不過,由於指令集不變,暫存器和指標仍然是32位元長,所以虛擬位址空間仍然限制在4GB。機器指令始終使用虛擬位址,而不是實體位址。

這樣做的結果是「highmem」在被映射到可尋址區域之前根本無法直接定址。這就是為什麼只有lowmem使用1:1映射;映射到 highmem 是不可能的。

您的下一個問題是:為什麼不能簡化 MMU 邏輯以跳過頁表並進行簡單的減法來獲取實體位址? MMU 在硬體中實現,它被設計為使用頁表(和 TLB)來完成其工作。不過,存在著「巨大」頁面,它會跳過頁表中的一級,使頁面大小為 4MB,而不是 x86 上的 4kB。

您的最後一個問題:x64 架構上的記憶體也分為 lowmem 和 highmem 嗎?不。具有更大位址空間(實體和虛擬)的 x64 不需要它。

相關內容