Linux
使用者頁表中的核心地址區域是否需要在 64 位系統中更新?
在具有超過 896 MB RAM 的 32 位系統中,很明顯,由於核心虛擬地址和非連續映射,核心地址的映射需要更改。
但是這在 64 位中是如何處理的呢?由於 RAM 總是可以完全映射到地址空間中,因此主核心頁表需要在初始化時設置一次,然後永遠不會改變,因為映射永遠不會改變。因此,使用者頁表中的這個核心區域永遠不需要更新?
順便說一句,有人很好地解釋了使用者程序頁表如何以 32 位更新?正如人們常說的,主核心頁表不是直接使用的,而只是作為參考。核心區域的條目是否為其使用者頁表中的每個程序複製?
在具有超過 896 MB RAM 的 32 位系統中,很明顯,由於核心虛擬地址和非連續映射,核心地址的映射需要更改。
是的,這被稱為highmem。
但是這在 64 位中是如何處理的呢?由於 RAM 總是可以完全映射到地址空間中,因此主核心頁表需要在初始化時設置一次,然後永遠不會改變,因為映射永遠不會改變。因此,使用者頁表中的這個核心區域永遠不需要更新?
是的。
順便說一句,有人很好地解釋了使用者程序頁表如何以 32 位更新?正如人們常說的,主核心頁表不是直接使用的,而只是作為參考。核心區域的條目是否為其使用者頁表中的每個程序複製?
在上面連結的 highmem 文件中,它說 highmem 映射只需要操作“核心的頁表”。
“頁表”實際上是一種樹形結構。例如參見“四級頁表”
$$ LWN.net, 2004 $$. 頂層是單頁(4096 字節)。映射核心範圍的條目在所有程序中設置為相同的值,因此是共享的。臨時映射發生在樹的較低層,因此它們只需要在共享核心頁表內部進行修改,不需要單獨修改每個程序的頁表。 至少,這是我的高級概述。我沒有所有的詞。