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