頁框用page描述符描述。所有的page放在mem_map陣列中,virt_to_page產生線性位址對應的頁描述符位址, pfn_to_page產生與頁框號對應的頁描述符位址。
linux記憶體被劃成幾個節點,節點包含幾個管理區, 包含第乙個頁框的頁框號, 頁描述符的陣列,在x86上只使用乙個結點,
x86上有三種記憶體管理區:zone_dma, zone_normal, zone_highmem.
管理區描述符包含所屬節點, 管理區的第乙個頁描述符指標, 第乙個頁框號等,
保留的頁框池用於中斷等原子記憶體請求操作時記憶體不足的情況,在zone_dma, zone_normal區按照他們的比例分配。
分割槽頁框分配器包含管理區分配器, 每cpu頁框快取記憶體, 夥伴系統,
每cpu頁框快取記憶體只分配乙個頁框, 它基於夥伴系統
夥伴系統用於分配連續的記憶體區
請求頁框的函式: alloc_pages(返回頁框描述符位址), alloc_page, __get_free_pages(返回線性位址), get_zeroed_page, __get_dma_pages,
高階記憶體無直接的線性位址, 只能用alloc_pages()返回頁框描述符位址,核心線性位址空間的最後128m中的部分用於對映高階記憶體頁框, 這種對映是臨時的(不夠用),
永久:pkmap_base, kmap()
臨時:kmap_atomic(), 在fix_kmap_begin處開始
夥伴系統:
把空閒頁分為11個塊鍊錶, 如果某煉表無足夠的記憶體, 就到更大一級分配,並把大一級的塊重新插入到小塊。__rmqueue()
__free_pages_bulk()釋放, 釋放會試圖把釋放的塊與大塊合併
每cpu頁框快取記憶體, 用於分配單個頁框請求, 分為冷熱快取(與硬體快取記憶體行有關),bufferred_rmqueue()分配該頁框, 如果每cpu頁框快取記憶體中的頁框數count小於等於low, 反覆呼叫__rmqueue()從夥伴系統中分配batch各單一頁框。free_hot_cold_page)釋放頁框到夥伴系統。
管理區分配器__alloca_pages(): 執行多次掃瞄以得到需要的記憶體。
slab管理器建立在快取記憶體基礎上, 分為專用和普通快取記憶體,
普通:(系統初始化期間由kmem_cache_init(), kmem_cache_sizes_init()來建立)
第乙個稱為kmem_cache, cache_cache變數包含它的第乙個快取記憶體描述符
其它包含在成幾何分布的malloc_sizes的表中,分為兩種: dma和normal
專用:(由kmem_cache_create在模組初始化的時候建立, 由kmem_cache_destroy在模組解除安裝的時候銷毀)
在普通快取記憶體基礎上建立
cache_grow分配slab快取, slab_destroy()釋放slab快取
slab需要著色演算法避免對映到同樣的記憶體行
kmem_cache_alloc()分配slab物件
kmem_cache_free()釋放slab物件
kmalloc/kfree用於從普通快取記憶體分配和釋放通用slab物件
記憶體池與保留頁框不同, 後者用於中斷等原子記憶體請求, 雖然前者也用於緊急記憶體分配, 記憶體池一般用來儲存slab物件,當然也用於一般型別的動態記憶體。需要註冊alloca和free方法。方法通常是mempool_alloc_slab()/mempool_free_slab(),
mempool_create()建立新記憶體池,註冊alloca/free方法, mempool_destroy相反
mempool_alloc呼叫alloc方法, mempool_free呼叫free方法
非連續記憶體是高階記憶體的一種, 在vmalloc_start(距離high_memory開始8m的地方)到vmalloc_end(距離pkmap_base8k)這段區域,
vfree釋放
Linux記憶體管理
本文首先介紹一下linux記憶體管理方式,著重說明一下使用者空間的記憶體管理,包括linux虛擬對映以及glibc中malloc的實現 然後簡要介紹單程序多執行緒的記憶體管理方式,主要涉及各執行緒堆疊空間的分配 linux 採用兩級保護機制,隔離核心空間和使用者程式空間,使使用者程式無法直接訪問核心...
Linux記憶體管理
本文首先介紹一下linux記憶體管理方式,著重說明一下使用者空間的記憶體管理,包括linux虛擬對映以及glibc中malloc的實現 然後簡要介紹單程序多執行緒的記憶體管理方式,主要涉及各執行緒堆疊空間的分配 linux採用兩級保護機制,隔離核心空間和使用者程式空間,使使用者程式無法直接訪問核心,...
Linux記憶體管理
首先我要說,我這是轉貼,轉的cu論壇上 nonameboy 的帖子,你可以連線過去看看。今天因為要解釋系統中可用記憶體的大小,用google看了半天,還有在cu上找了關天,竞然沒有發現有比較好的章,估計很多人都沒有注意到,懂了以後又沒有整理出來。在cu上看了很多文章說什麼memory leak和li...