虛擬地址空間布局架構(gòu)
內(nèi)存管理架構(gòu)
內(nèi)存管理子系統(tǒng)架構(gòu)可以分為:用戶空間、內(nèi)核空間及硬件部分3個(gè)層面。
用戶空間:應(yīng)用程序使用malloc()申請內(nèi)存資源/free()釋放內(nèi)存資源。 內(nèi)核空間:內(nèi)核總是駐留在內(nèi)存中,是操作系統(tǒng)的一部分。內(nèi)核空間為內(nèi)核保留, 不允許應(yīng)用程序讀寫該區(qū)域的內(nèi)容或直接調(diào)用內(nèi)核代碼定義的函數(shù)。 硬件:處理器包含一個(gè)內(nèi)存管理單元(Memory Management Uint,MMU)的部 件,負(fù)責(zé)把虛擬地址轉(zhuǎn)換為物理地址。
Linux內(nèi)核整體架構(gòu)及子系統(tǒng)
Linux內(nèi)核只是操作系統(tǒng)當(dāng)中的一部分,對下管理系統(tǒng)所有硬件設(shè)備;對上通過系統(tǒng)調(diào)用向Library Routinue或(或者其它應(yīng)用程序提供API接口)。

重心:管理硬件設(shè)備、供應(yīng)用程序使用。 現(xiàn)在系統(tǒng)標(biāo)準(zhǔn)組成:CPU、Memory內(nèi)存和外存)、I/O設(shè)備、網(wǎng)絡(luò)設(shè)備和其他外圍設(shè)備。


【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個(gè)人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)? ??


用戶空間
應(yīng)用程序使用malloc()申請內(nèi)存,free()釋放內(nèi)存。malloc()/free()是glibc庫的內(nèi)存分配器ptmalloc提供的接口,ptmalloc使用系統(tǒng)調(diào)用brk或mmap向內(nèi)核以頁為單位申請內(nèi)存,然后進(jìn)行分成很小的內(nèi)存塊分配給對應(yīng)的應(yīng)用程序。
內(nèi)核空間
虛擬內(nèi)存管理負(fù)責(zé)從進(jìn)程的虛擬地址空間分配虛擬頁,sys_brk來擴(kuò)大或收縮堆,sys_mmap用來在內(nèi)存映射區(qū)域分配虛擬頁,sysmunmap用來釋放虛擬頁。頁分配器負(fù)責(zé)分配物理頁,使用的分配器是伙伴分配器。 內(nèi)核空間擴(kuò)展功能,不連續(xù)頁分配器提供分配內(nèi)存的接口vmalloc和釋放內(nèi)存接口vfree。在內(nèi)存碎片化的時(shí)候,申請連續(xù)物理頁的成功率比較低,可以申請不連續(xù)的物理頁,映射到連續(xù)的虛擬頁,即虛擬地址連續(xù)而物理地址不連續(xù)。 內(nèi)存控制組用來控制進(jìn)程占用的內(nèi)存資源。當(dāng)內(nèi)存碎片化的時(shí)候,找不到連續(xù)的物理頁,內(nèi)存碎片整理通過遷移方式得到連續(xù)的物理頁。在內(nèi)存不足的時(shí)候,頁回收負(fù)責(zé)回收物理頁。
硬件
MMU包含一個(gè)頁表緩存,保存最近使用過的頁表映射,避免每次把虛擬地址轉(zhuǎn)換為物理地址都需要查詢內(nèi)存中的頁表。解決處理器執(zhí)行速度和內(nèi)存速度不匹配問題,中間增加一個(gè)緩存。一級緩存分為數(shù)據(jù)緩存和指令緩存。二級作用協(xié)調(diào)一級緩存和內(nèi)存之間的工作效率。
系統(tǒng)調(diào)用(system call)



虛擬地址空間布局架構(gòu)
應(yīng)用程序沒有那么大的內(nèi)存需求,ARM64處理器不支持完全的64位虛擬地址。 在ARM64架構(gòu)的Linux內(nèi)核中,內(nèi)核虛擬地址和用戶虛擬地址的寬度相同。 所有進(jìn)程共享內(nèi)核虛擬地址空間,每個(gè)進(jìn)程有獨(dú)立的用戶虛擬地址空間,同一個(gè)線程組的用戶線程共享用戶虛擬地址空間,內(nèi)核線程沒有用戶虛擬地址空間。

用戶虛擬地址空間劃分
進(jìn)程的用戶虛擬空間的起始地址是0,長度是TASK_SIZE,由每種處理器架構(gòu)定義自己的宏TASK_SIZE。 ARM64架構(gòu)定義的宏TASK_SIZE如下: 32位用戶空間程序:TASK_SIZE的值是TASK_SIZE_32,即0x100000000,等4GB。 64位用戶空間程序:TASK_SIZE的值是TASK_SIZE_64,即2^VA_BITS字節(jié)。 VA_BITS是編譯內(nèi)核時(shí)候選擇的虛擬地址位數(shù) 進(jìn)程的用戶虛擬地址空間包含區(qū)域:
代碼段、數(shù)據(jù)段、未初始化的數(shù)據(jù)段 動態(tài)庫的代碼段、數(shù)據(jù)段和未初始化的數(shù)據(jù)段 存放動態(tài)生成的數(shù)據(jù)的堆 存放局部變量和實(shí)現(xiàn)函數(shù)調(diào)用的棧 把文件區(qū)間映射到虛擬地址空間的內(nèi)存映射區(qū)域 存放在棧底部的環(huán)境變量和參數(shù)字符串 內(nèi)核使用內(nèi)存描述符mm_struct描述進(jìn)程的用戶虛擬地址空間。 一個(gè)進(jìn)程的虛擬地址空間主要由兩個(gè)數(shù)據(jù)結(jié)構(gòu)進(jìn)行描述。一個(gè)是最高層次的mm_struct,一個(gè)是較高層次的vm_area_struct。最高層次mm_struct描述一個(gè)進(jìn)程整個(gè)虛擬地址空間,較高層次結(jié)構(gòu)描述虛擬地址空間的一個(gè)區(qū)間(稱為虛擬區(qū))。每個(gè)進(jìn)程只有一個(gè)mm_struct結(jié)構(gòu),在每個(gè)進(jìn)程的task_struct結(jié)構(gòu)中,有一個(gè)專門用來指向該進(jìn)程的結(jié)構(gòu)。mm_struct結(jié)構(gòu)是對整個(gè)用戶空間的描述。

內(nèi)核地址空間布局
KASAN:動態(tài)內(nèi)存錯(cuò)誤檢查工具 [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-yY3P7wzG-1642343462340)(C:%5CUsers%5CLenovo%5CPictures%5C2700310-20220107234027970-821637894.png)]
總結(jié)
本文介紹了Linux內(nèi)存管理架構(gòu),包括用戶空間、內(nèi)核空間、硬件部分,系統(tǒng)調(diào)用作用;虛擬地址空間架構(gòu),虛擬地址空間劃分,內(nèi)核地址空間布局等。
