linux內(nèi)核態(tài)的內(nèi)存管理主要是基于伙伴系統(tǒng)和slab機(jī)制锦溪,而用戶態(tài)內(nèi)存管理主要是VMA虛擬地址空間茧跋。
在linux操作系統(tǒng)中暖眼,每個(gè)進(jìn)程都通過一個(gè)task_struct的結(jié)構(gòu)體描敘颤绕,每個(gè)進(jìn)程的地址空間都通過一個(gè)mm_struct描敘捕虽,c語言中的每個(gè)段空間都通過vm_area_struct表示慨丐。
task_struct中的mm_struct就代表進(jìn)程的整個(gè)內(nèi)存資源,mm_struct中的pgd為頁表泄私,mmap指針指向的vm_area_struct鏈表的每一個(gè)節(jié)點(diǎn)就代表進(jìn)程的一個(gè)虛擬地址空間房揭,即一個(gè)VMA。一個(gè)VMA最終可能對應(yīng)ELF可執(zhí)行程序的數(shù)據(jù)段晌端、代碼段捅暴、堆、棧咧纠、或者動態(tài)鏈接庫的某個(gè)部分伶唯。
而malloc的過程其實(shí)就是把VMA分配到各種段當(dāng)中,這時(shí)候是沒有真正分配物理地址的惧盹。malloc 調(diào)用后乳幸,只是分配了內(nèi)存的邏輯地址瞪讼,在內(nèi)核的mm_struct 鏈表中插入vm_area_struct結(jié)構(gòu)體,沒有分配實(shí)際的內(nèi)存粹断。當(dāng)分配的區(qū)域?qū)懭霐?shù)據(jù)時(shí)符欠,會引發(fā)缺頁異常,然后會建立物理頁和邏輯地址的映射瓶埋。