高階記憶體疑惑

2021-06-09 00:52:16 字數 893 閱讀 7751

高階記憶體是指實體地址大於 896m 的記憶體。

高階記憶體含義為:線性位址空間 page_offset + 896m 至4g的最後128m線性位址

對於這樣的記憶體,無法在「核心直接對映空間」進行對映。

為什麼?

因為「核心直接對映空間」最多只能從 3g 到 4g,只能直接對映 1g 物理記憶體,對於大於 1g 的物理記憶體,無能為力。

實際上,「核心直接對映空間」也達不到 1g, 還得留點線性空間給「核心動態對映空間」 呢。

因此,linux 規定「核心直接對映空間」 最多對映 896m 物理記憶體。

對於高階記憶體,可以通過 alloc_page() 或者其它函式獲得對應的 page,但是要想訪問實際物理記憶體,還得把 page 轉為線性位址才行(為什麼?想想 mmu 是如何訪問物理記憶體的),也就是說,我們需要為高階記憶體對應的 page 找乙個線性空間,這個過程稱為高階記憶體對映。至於高階記憶體對映方式,網上有很多資料

使用者空間當然可以使用高階記憶體,而且是正常的使用,核心在分配那些不經常使用的記憶體時,都用高階記憶體空間(如果有),所謂不經常使用是相對來說的,比如核心的一些資料結構就屬於經常使用的,而使用者的一些資料就屬於不經常使用的。

使用者在啟動乙個應用程式時,是需要記憶體的,而每個應用程式都有3g的線性位址,給這些位址對映頁表時就可以直接使用高階記憶體。

而且還要糾正一點的是:那128m線性位址不僅僅是用在這些地方的,如果你要載入乙個裝置,而這個裝置需要對映其記憶體到核心中,它也需要使用這段線性位址空間來完成,否則核心就不能訪問裝置上的記憶體空間了。

總之,核心的高階線性位址是為了訪問核心固定對映以外的記憶體資源

實際上高階記憶體是針對核心一段特殊的線性空間提出的概念,和實際的物理記憶體是兩碼事。程序在使用記憶體時,觸發缺頁異常,具體將哪些物理頁對映給使用者程序是核心考慮的事情。在使用者空間中沒有高階記憶體這個概念。

高階記憶體與低端記憶體

高階記憶體是 linux 中乙個重要的概念,初涉 linux 時曾經對這個概念非常迷惑。實際上這個概念比較簡單,理解這個概念,需要追溯一下 linux 的記憶體管理。從前,cpu的位址匯流排只有 32位,再早的就不再追溯了。32的位址匯流排無論是從邏輯上還是從物理上都只能描述 4g的位址空間,在物理...

高階記憶體與低端記憶體

高階記憶體是linux中乙個重要的概念,初涉linux時曾經對這個概念非常迷惑。實際上這個概念比較簡單,理解這個概念,需要追溯一下linux的記憶體管理。從前,cpu的位址匯流排只有32位,再早的就不再追溯了。32的位址匯流排無論是從邏輯上還是從物理上都只能描述4g的位址空間,在物理上理論上最多擁有...

高階記憶體和低端記憶體

高階記憶體是linux中乙個重要的概念,初涉linux時曾經對這個概念非常迷惑。實際上這個概念比較簡單,理解這個概念,需要追溯一下linux的記憶體管理。從前,cpu的位址匯流排只有32位,再早的就不再追溯了。32的位址匯流排無論是從邏輯上還是從物理上都只能描述4g的位址空間,在物理上理論上最多擁有...