Linux high memory 學習總結

2021-09-07 05:47:18 字數 2421 閱讀 1004

在free命令中有個引數l,它表示 show detailed low and high memory statistics。其實最先是對high memory總是為零有些不解(linux是64為)。其實更不解的是關於low memory、high memory。那麼關於low memory和high memory是怎麼一回事呢?如下截圖所示:

一直對這個概念不解,直到看到關於linux kernel裡的high memory 這篇文章。下面文字全部摘自這篇文章

今天有人問我linux kernel裡的high memory是怎麼回事,說的比較亂,現在整理下。

high memory只存在於32位kernel下,以下文字都針對32位kernel。

1)什麼是high memory,為什麼要有high memory

linux人為的把4g虛擬位址空間(32位位址最多定址4g)分為3g+1g,其中0~3g為使用者程式位址空間,3g~4g為kernel位址空間(為什麼要這麼分?為什麼使用者程式和kernel不能各自獨享4g虛擬位址空間?這兩個問題下次再說吧,這裡不表),這就是說kernel最多定址1g的虛擬位址空間。

當cpu啟用mmu的paging機制後,cpu訪問的是虛擬位址,然後由mmu根據頁表轉換成實體地址。頁表是由kernel維護的,所以kernel可以決定1g的虛擬位址空間具體對映到什麼實體地址。但是kernel最多只有3g~4g這1g位址空間,所以不管kernel怎麼對映,最多只能對映1g的物理記憶體。所以如果乙個系統有超過1g的物理記憶體,在某一時刻,必然有一部分kernel是無法直接訪問到的(這個一定要想清楚,不然無法明白high memory)。另外,kernel除了訪問記憶體外,還需要訪問很多io裝置。在現在的計算機體系結構下,這些io裝置的資源(比如暫存器,片上記憶體等)一般都是通過mmio的方式對映到物理記憶體位址空間來訪問的,就是說kernel的1g位址空間除了對映記憶體,還要考慮到對映這些io資源--換句話說,kernel還需要預留出一部分虛擬位址空間用來對映這些io裝置(ioremap就是幹這個的)。

linux kernel採用了最簡單的對映方式來對映物理記憶體,即把實體地址+3g按照線性關係直接對映到kernel空間。考慮到一部分kernel虛擬位址空間需要留給io裝置(以及一些其他特殊用途),linux kernel最多直接對映896m物理記憶體,而預留了最高端的128m虛擬位址空間給io裝置(還有其他的用途)。所以,當系統有大於896m記憶體時,超過896m的記憶體kernel就無法直接訪問到了(想明白了麼?),這部分記憶體就是high memory。那kernel就永遠無法訪問到超過896m的記憶體了馬?不是的,kernel已經預留了128m虛擬位址,我們可以用這個位址來動態的對映到high memory,從而來訪問high memory。所以預留的128m除了對映io裝置外,還有乙個重要的功能是提供了一種動態訪問high memory的一種手段(kmap主要就是幹這個的,當然還有vmalloc)。

當然,在系統物理記憶體<896m,比如只有512m的時候,就沒有high memory了,因為512m的物理記憶體都已經被kernel直接對映。事實上,在物理記憶體<896m時,從3g+max_phy ~ 4g的空間都作為上述的預留的核心位址空間(未考證)。

要理解high memory,關鍵是把物理記憶體管理,虛擬位址空間管理,以及兩者間的對映(頁表管理)三個部分分開考慮,不要把物理記憶體管理和虛擬位址空間管理混在一起。比如high memory也參與kernel的物理記憶體分配,你呼叫get_page得到的物理頁有可能是low memory,也可以是high memory,這個物理頁可以被對映到kernel,同時也可以被對映到user space。再比如vmalloc,只保證返回的虛擬位址是在預留的vmalloc area裡,對應的物理記憶體,可以是low memory,也可以是high memory。當然出於效能考慮,kernel可能會優先分配直接對映的low memory,但我們不能假設high memory就不會被分配到。

一些結論:

1)high memory針對的是物理記憶體,不是虛擬記憶體,更確切的,虛擬位址空間。

2)high memory也是被核心管理的(有對應的page結構),只是沒有對映到核心虛擬位址空間。當kernel需要分配high memory時,通過kmap等從預留的位址空間中動態分配乙個位址,然後對映到high memory,從而訪問這個物理頁。

3)high memory和low memory一樣,都是參與核心的物理記憶體分配,都可以被對映到kernel位址空間,也都可以被對映到user space位址空間。

4)物理記憶體<896m時,沒有high memory,因為所有的記憶體都被kernel直接映**。

5)64位系統下不會有high memory,因為64位虛擬位址空間非常大(分給kernel的也很大),完全能夠直接對映全部物理記憶體。

另外,在《understanding the linux virtual memory manager》這本書中有linux 程序位址空間劃分的詳細圖,很不錯,我就懶得畫了。

Linux high memory 學習總結

在free命令中有個引數l,它表示 show detailed low and high memory statistics。其實最先是對high memory總是為零有些不解 linux是64為 其實更不解的是關於low memory high memory。那麼關於low memory和high...

linux high memory機制引發的問題

32bit作業系統 linux將邏輯位址空間分為兩部分 0 3g是使用者位址空間,3 4g是核心位址空間。所以linux核心只能夠訪問實體地址空間大小為1g,也就是實體地址0 1g。為了能夠訪問所有的實體地址空間,linux提出了high memory機制 從核心位址空間劃分出一部分作為high m...

Xamarin for android學習總結一

1.adapter就是資料讀入記憶體後的 記憶體中介 2.intend,broadcast,server,provider,activity,執行關係圖 3.toast用於向使用者顯示一些幫助 提示 c 中toast是由其他執行緒呼叫更新ui主線程之用 4.android中ui執行緒與後台執行緒互動...