一、linux記憶體結構分為:node(節點),zone(區域),page(頁框描述符)
node ----{ zone-----{ page
{ zone-----{page
二、對映高階記憶體的方法:
1)永久對映:
使用核心中專門儲存的乙個頁表來實現,相當於是建立頁表對映,因為涉及到操作頁表有可能休眠
void *kmap(struct page * page);
用法:struct page * page = alloc_pages(gfp_highmem,1);
int * vaddr = kmap(page);
2)臨時對映:
使用核心中專門儲存的乙個頁表項(page table entry)來實現,相當於是建立頁表對映,不會導致休眠
void *kmap_atomic(struct page * page);
用法:struct page * page = alloc_pages(gfp_highmem,1);
int * vaddr = kmap_atomic(page);
三、記憶體區域管理
zone和buddy演算法解決了申請頁框時的問題:硬體限制和記憶體碎片。
而在實際的核心程式設計中最常碰到的是各種不同size資料結構mem request的申請和釋放,要解決這種型別記憶體請求的效率和記憶體碎片問題,
就需要用到cache和slab,原因有:
1)相同size記憶體的申請和釋放相當常見,為了避免核心疲於應付這些工作,核心提供了乙個方法:基於cache來建立slab系統,每個slab
對應相應的記憶體單元size,申請到來時及時滿足,釋放時進行軟體**,這樣就避免了頻繁做頁框動作。
2)為了解決記憶體碎片問題,
四、非連續記憶體區的管理
非連續記憶體區是指線性位址連續,實體地址不連續的vmalloc區域,該區域用於對映超過896mb的物理記憶體頁框,
通常只適用於x86架構,arm等嵌入式架構很少會用到這麼大的記憶體量,因此在arm架構下kmap,永久核心對映,
固定核心對映都用不到。
其實vmalloc的實現方法就是通過alloc_pages來申請數個頁框,當然這些頁框位於highmem,來滿足申請的記憶體大小,
然後修改頁表,建立vmalloc段線性位址到這些頁表的對映。
Linux記憶體管理
本文首先介紹一下linux記憶體管理方式,著重說明一下使用者空間的記憶體管理,包括linux虛擬對映以及glibc中malloc的實現 然後簡要介紹單程序多執行緒的記憶體管理方式,主要涉及各執行緒堆疊空間的分配 linux 採用兩級保護機制,隔離核心空間和使用者程式空間,使使用者程式無法直接訪問核心...
Linux記憶體管理
本文首先介紹一下linux記憶體管理方式,著重說明一下使用者空間的記憶體管理,包括linux虛擬對映以及glibc中malloc的實現 然後簡要介紹單程序多執行緒的記憶體管理方式,主要涉及各執行緒堆疊空間的分配 linux採用兩級保護機制,隔離核心空間和使用者程式空間,使使用者程式無法直接訪問核心,...
Linux記憶體管理
首先我要說,我這是轉貼,轉的cu論壇上 nonameboy 的帖子,你可以連線過去看看。今天因為要解釋系統中可用記憶體的大小,用google看了半天,還有在cu上找了關天,竞然沒有發現有比較好的章,估計很多人都沒有注意到,懂了以後又沒有整理出來。在cu上看了很多文章說什麼memory leak和li...