對Linux內存管理的整體理解

內核中內存的管理與分配

內存的分配歸根到底是由夥伴系統分配內存頁面;

夥伴系統之上就是zone,它對內存的預留空間的設置和管理;
__alloc_pages()是內核中對內存頁面分配的最核心函數,它盡最大能力的分配所需要的內存頁;
slab是爲了頻繁利用的結構體而設置的cache,其基於頁的分配;

對內核中896MB之上的連續虛擬內存的分配(vm_struct), 基本操作就是先分配不連續的頁面page,然後將這些page與頁表項關聯;這些頁表項的更改是在內核頁表中,進程的相應頁表並不改變,只有在訪問的時候出現缺頁,然後就會去內核中複製!

在進程要求分配線性地址空間時,系統只是象徵性的創建相應的頁表和vm_struct結構,後者是對內存區域的管理結構,進程中內存區域的權限可能不一樣;進程真正的使用物理內存應該是利用缺頁異常機制!

用戶空間中進程的內存分配和管理

虛擬地址與物理地址的關聯是依靠頁表項,頁表項中有相應的物理地址,那麼page結構體的作用何在?

page結構體中是關於該物理內存頁的相關屬性,通過mmap[address>>PAGE_SHIFT]可以定位到該page的位置,讀取該物理頁相應的狀態

進程的用戶級堆棧都是特殊的內存區域(vm_struct),對堆棧的管理就是對vm_struct的管理
創建進程內存空間的基本原理:寫時複製,缺頁異常機制,按需分配;
進程內存空間管理由2部分組成:虛擬內存區域(vm_struct)和多級頁表

新頁面的分配,基本步驟是先分配一個物理頁面,然後在頁表中與相應的頁表項關聯

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章