Linux操作系統(tǒng)中,kernel和設(shè)備驅(qū)動是運行在內(nèi)核空間,用戶進程運行在用戶空間钞楼;當用戶程序需要訪問硬件設(shè)備時是通過系統(tǒng)調(diào)用惠窄,由kernel來完成對硬件設(shè)備的訪問蒸眠。
Linux是通過虛擬內(nèi)存機制來實現(xiàn)對物理內(nèi)存的訪問。
在邏輯上物理內(nèi)存是通過分區(qū)來管理的
1 32位的x86架構(gòu)下杆融,物理內(nèi)存空間布局如下:
ZONE_DMA: 0~16M ,該區(qū)域的物理頁面是專供IO設(shè)備使用的楞卡,對該部分的物理地址是直接訪問的,不經(jīng)過MMU轉(zhuǎn)換的。并且是連續(xù)的物理地址蒋腮。
ZONE_NORMAL:16~896M淘捡,該區(qū)域的物理頁面是內(nèi)核能直接使用的
ZONE_HIGHEME: 896M ~ 結(jié)束,該區(qū)域的物理頁面內(nèi)核不能直接使用
2 Linux虛擬地址內(nèi)核空間分布
虛擬地址空間的0~3G是用戶空間池摧,3~4G是內(nèi)核空間
內(nèi)核空間的3G~3G+16M案淋,用于DMA操作
內(nèi)核空間的3G+16M~3G+896M,用于NORMAL
內(nèi)核空間的3G+896M~4G险绘,是高端內(nèi)存區(qū)踢京,高端內(nèi)存區(qū)內(nèi)核不能直接使用,是通過動態(tài)映射到物理內(nèi)存的高896M的空間宦棺,使用完就釋放瓣距。
內(nèi)核地址的3G+896M是一一映射到物理地址的0-896M空間,在內(nèi)核初始化時代咸,內(nèi)核的這部分地址空間已經(jīng)把地址映射寫死蹈丸。
3 linux虛擬地址用戶空間分布
虛擬地址的0~3G的用戶空間,也是通過劃分不同的線性區(qū)來管理的呐芥。當有新的用戶進程創(chuàng)建時會通過系統(tǒng)調(diào)用來加載可執(zhí)行程序逻杖,為進程分配一系列的線性區(qū)并存放不同的內(nèi)容。
分配順序是思瘟,棧段->代碼段->數(shù)據(jù)段->bss->依賴庫荸百,堆是在運行過程中動態(tài)分配的,由內(nèi)核中brk和mmap函數(shù)實現(xiàn)滨攻,C庫將其封裝成malloc函數(shù)够话。