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