linux内存管理 之 内存节点和内存分区(Zone)
生活随笔
收集整理的這篇文章主要介紹了
linux内存管理 之 内存节点和内存分区(Zone)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
https://www.cnblogs.com/youngerchina/p/5624516.html
Linux支持多種硬件體系結構,因此Linux必須采用通用的方法來描述內存,以方便對內存進行管理。為此,Linux有了內存節(jié)點、內存區(qū)、頁框的概念,這些概念也是一目了然的。
內存節(jié)點(Node):主要依據CPU訪問代價的不同而劃分。多CPU下環(huán)境下,本地內存和遠端內存就是不同的節(jié)點。即使在單CPU環(huán)境下,訪問所有內存的代價都是一樣的,Linux內核依然存在內存節(jié)點的概念,只不過只有一個內存節(jié)點而已。內核以struct? pg_data_t來描述內存節(jié)點。內存分區(qū)(Zone):Linux對內存節(jié)點再進行劃分,分為不同的分區(qū)。內核以struct zone來描述內存分區(qū)。通常一個節(jié)點分為DMA、Normal和High Memory內存區(qū),具體下面再介紹。
頁框(Page Frame):Linux采用頁式內存管理,頁是物理內存管理的基本單位,每個內存分區(qū)又由大量的頁框組成。內核以struct page來描述頁框。頁框有很多屬性,這些屬性描述了這個頁框的狀態(tài)、用途等,例如是否被分配。
上圖中的zone_mem_map是一個頁框的數組,它記錄了一個內存分區(qū)的所有頁框的使用情況。
DMA內存區(qū):即直接內存訪問分區(qū),通常為物理內存的起始16M。主要是供一些外設使用,外設和內存直接訪問數據訪問,而無需系統(tǒng)CPU的參與。
Normal內存區(qū):從16M到896M內存區(qū)。
HighMemory內存區(qū):896M以后的內存區(qū)。
為什么高端內存的邊界是896M?這是因為,32位Linux虛擬內存空間為0-4G,其中0-3G用于用戶態(tài),3G-4G用于內核態(tài)。這意味著內核只有1G的虛擬地址空間,如果物理內存超過1G,內核就無法映射了。Linux采取的策略是,內核地址空間的前896M采用固定映射,映射方法是:虛擬地址-3G = 物理地址,只能映射到物理地址的前896M。也就是說內核虛擬地址空間的3G到3G+896M這部分,頁表的映射是固定的,系統(tǒng)初始化時就建立起來。而虛擬地址空間的最后128M,也就是3G+896M到4G部分采用動態(tài)映射,也就是說頁表映射的物理地址可變的。在系統(tǒng)運行過程中,通過更新頁表,就可以映射到不同的物理地址,當然也包括高端物理內存。
這主要解決了兩個問題:第一,這可以使內核地址空間映射到高端物理內存;第二,虛擬地址空間的3G+896M到4G部分,連續(xù)的虛擬地址空間可以映射到非連續(xù)的物理內存,只要通過更新頁表就可以做到,這和用戶態(tài)的虛擬內存映射采用了同樣這種方法。這在沒有大段連續(xù)的空閑物理地址時,是非常重要的。
備用內存區(qū):
在一個內存區(qū)分配頁時,如果這個內存區(qū)沒有滿足條件的內存頁,則需要從其它內存區(qū)或從其它內存節(jié)點分配。Linux為每個內存區(qū)都建立了備用內存區(qū)列表,當前內存區(qū)沒有滿足條件的內存時,就從備用內存區(qū)分配。比如,系統(tǒng)中有4個內存節(jié)點A,B,C,D,每個內存節(jié)點又分為DMA、Normal、HighMemory內存區(qū)。對節(jié)點B來說,內存區(qū)分配列表可能是B(HighMemory)、B(Normal)、B(DMA)、A(HighMemory)、A(Normal)、A(DMA)、C(HighMemory)、C(Normal)、C(DMA)、D(HighMemory)、D(Normal)、D(DMA)。
分配內存時,優(yōu)先從本地內存節(jié)點分配,再從其它內存節(jié)點分配。對一個內存節(jié)點,優(yōu)先從HighMemory分配,再從Normal或DMA分配。
總結
以上是生活随笔為你收集整理的linux内存管理 之 内存节点和内存分区(Zone)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux kernel内存回收机制
- 下一篇: Linux地址映射--线性映射与非线性映