Linux內存管理-頁描述符與內存管理區

頁描述符

我們都知道Linux的內存是分頁的,在Linux 中每頁的大小是4KB(大部分情況下),Linux需要記錄下來每一頁的狀態,于是很顯然地,需要一些額外的內存去存儲這些狀態信息,對于每一頁內存,linux 需要用32個字節去管理(可能與最新版的linux有所出入),稱之為頁描述符,這些頁描述符加起來大概占用不到整個內存的1%。

頁描述符具體都干了什么?

從最初的Linux版本發展到現在,這個頁描述符已經變得相當復雜,下面是一個簡化版本

129 typedef struct pglist_data {

130? ? zone_t node_zones[MAX_NR_ZONES];

131? ? zonelist_t node_zonelists[GFP_ZONEMASK+1];

132? ? int nr_zones;

133? ? struct page *node_mem_map;

134? ? unsigned long *valid_addr_bitmap;

135? ? struct bootmem_data *bdata;

136? ? unsigned long node_start_paddr;

137? ? unsigned long node_start_mapnr;

138? ? unsigned long node_size;

139? ? int node_id;

140? ? struct pglist_data *node_next;

141 } pg_data_t;


這里面最重要的兩個字段是

count:

代表該頁的引用計數器,如果等于-1,則代表相應的頁框是空閑,可以被分配給任意一個進程或者內核本身,如果大于0則代表已經被分配給了一個或者多個進程

flags:

描述該內存頁的狀態,標志說明

PG_locked頁被鎖定

PG_error在傳輸過程中發生I/O錯誤

PG_referenced剛剛訪問過的頁

PG_uptodate在完成讀操作后置位

等等..

內存管理區

在實際的計算機體系結構中,Linux并不能對所有的內存一視同仁,因為現有的硬件約束不允許,主要來自以下兩點

1、ISA總線的DMA直接內存存取處理器有嚴格的限制,只能對RAM的前16M尋址(因為ISA的總線只有16位)

2、在具有大容量RAM的現代32位計算機中,CPU不能 訪問所有的物理內存,因為線性地址太小?

為了應對這兩種限制,Linux把每個內存節點物理內存劃分為3個管理區

1、ZONE_DMA,包含低于16M的內存頁框

2、ZONE_NORMAL,包含低于16M且低于896M的內存頁框

3、ZONE_HIGHMEM,包含高于896M的內存頁框

想必有一個問題是無法避免的,為什么ZONE_NORMAL只包含到896M的內存?

我的個人理解是,Linux把地址空間分為用戶地址空間和內核地址空間,在4GB的LInux機器上3GB用來做用戶地址空間,1GB用來做內核地址空間(大部分情況下是這樣,可以配置),內核有時需要訪問用戶地址空間中的物理地址,于是內核劃分128M來用于映射用戶地址空間的地址,如此一來1GB-128M=896MB。

這種情況在64位系統上有所不同,在64位系統上,LInux也只使用其中的48位用來尋址,也就是說, 總的虛擬地址空間為256TB( 2^48 )。這其中0000000000000000 - 00007fffffffffff(128TB)為用戶空間, ffff800000000000 - ffffffffffffffff(128TB)為內核空間,可以看到內核空間之大,已經可以足夠映射所有的物理內存了,所以在X86-64的Linux系統上,ZONE_HIGHMEM不存在。

還有一個名詞叫做內存節點,這個東西很不常用,主要是有一種比較詭異的內存模型稱之為Non-Uniform Memory Access (NUMA),在這種內存模型下,CPU對不同地址尋址的性能可能會不盡相同,LInux為了支持該內存模型,提出了內存節點的概念,把性能相近的地址范圍劃分在一個內存節點中。整個內存的數據結構如下圖所示:

pg_data_t其實就是一個內存節點,在NUMA的機器上可能會有多個,在UMA(Uniform Memory Access)的機器上只有一個,NUMA至少我是沒見過。

node_zones其實指的就是內存節點中的物理內存劃分了,也就是我們上面講的那些。

struct page就是頁描述符

如有錯誤請指正。

參考:

《深入理解LInux內核》第三版

https://www.kernel.org/doc/gorman/html/understand/understand005.html

http://adam8157.info/blog/2012/07/linux-x86-64-vm/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,247評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,520評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,362評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,805評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,541評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,896評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,887評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,062評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,608評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,356評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,555評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,077評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,769評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,175評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,489評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,289評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,516評論 2 379

推薦閱讀更多精彩內容