資源描述:
《深度分析linux內(nèi)核高端內(nèi)存分析》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫(kù)。
1、Linux內(nèi)核高端內(nèi)存1.Linux內(nèi)核地址映射模型x86CPU采用了段頁(yè)式地址映射模型。進(jìn)程代碼中的地址為邏輯地址,經(jīng)過(guò)段頁(yè)式地址映射活,才真正訪問(wèn)物理內(nèi)存。段頁(yè)式機(jī)制如下圖LogicalAddress(orFarPointer)SegmentSelectorOffsetLinearAddressSegmentationPaging2.Linux內(nèi)核地址空間劃分通常32位Linux內(nèi)核地址空間劃分0?3G為用戶空間,3?4G為內(nèi)核空間。注意這里是32位內(nèi)核地址空間劃分,64位內(nèi)核地址空間劃分是不同的。kernelmemory(1GB)OxCOO
2、OOOOOTASK_SI2E=OxCOOOOOOO(Upper-limitofuser-space)usermemory(3GB)PAGE_OFFSET=OxCOOOOOOO(Lowerboundofkernelspace)0x000000003.Linux內(nèi)核高端內(nèi)存的由來(lái)當(dāng)內(nèi)核模塊代碼或線程訪內(nèi)存吋,代碼屮的內(nèi)存地址都為邏輯地址,而對(duì)I、V:到真正的物理內(nèi)存地址,需耍地址一對(duì)一的映射,如邏輯地址0XC0000003對(duì)應(yīng)的物理地址為0x3,0xc0000004對(duì)應(yīng)的物理地址為0x4,,邏輯地址與物理地址對(duì)應(yīng)的關(guān)系為物理地址=邏輯地址-OxCOO
3、OOOOO邏輯地址物理內(nèi)存地址OxCOOOOOOO0x00xc00000010x10xc00000020x20xc00000030x3?譬穆0xe00000000x20000000……Oxffffffff0x40000000??假設(shè)按照上述簡(jiǎn)單的地址映射關(guān)系,那么內(nèi)核邏輯地址空間訪問(wèn)為OxcOOOOOOO?Oxffffffff,那么對(duì)應(yīng)的物理內(nèi)存范M就為0x0?0x40000000,即只能訪W1G物理內(nèi)存??鄼C(jī)器中安裝8G物理內(nèi)存,那么內(nèi)核就只能訪問(wèn)前1G物理閃存,物理㈧存將會(huì)無(wú)法訪問(wèn),因?yàn)殚W核的地址空間已經(jīng)企部映射到物理內(nèi)存地址范圍0x0?0x
4、40000000。即使安裝了8G物理內(nèi)存,那么物理地址為0x40000001的內(nèi)存,內(nèi)核該怎么去訪問(wèn)呢?代碼中必須要有內(nèi)存邏輯地址的,0XC0000000?Oxffffffff的地址空間已經(jīng)被用完了,所以無(wú)法訪問(wèn)物理地址0x40000000以后的閃存。站然不能將內(nèi)核地址交間OXCOOOOOOO-Oxfffffff全部川來(lái)簡(jiǎn)申的地址映射,因此X86架構(gòu)中將內(nèi)核地址空間劃分三部分:ZONE_DMA、ZONE_NORMAL和ZONE_HIGHMEM,ZONE_HIGHMEM即為高端內(nèi)存,這就足內(nèi)存商端內(nèi)存概念的山來(lái)。在x86結(jié)構(gòu)巾,三種類型的區(qū)域如下:
5、ZONENORMAL16MB?896MBZONE_HIGHMEM896MB?結(jié)朿896-MBVirtualaddress-space4.Linux內(nèi)核高端內(nèi)存的理解前面我們解釋了高端內(nèi)存的由來(lái)。Linux將內(nèi)核地址空問(wèn)劃分為三部分ZONE_DMA、ZONE_NORMAL和ZONE_HIGHMEM,高端內(nèi)存HIGH_MEM地址空間范M為0xF8000000?OxFFFFFFFF(896MB?1024MB)。那么如內(nèi)核足如何借助128MB高端內(nèi)存地址空間是如何實(shí)現(xiàn)訪問(wèn)可以所有物理內(nèi)存?當(dāng)內(nèi)核想訪問(wèn)島于896MB物理地址閃存時(shí),從0xF8000000~
6、OxFFFFFFFF地址空間范圍I人J找一段相應(yīng)人小中W的邏輯地址中間,借用一會(huì)。借用這段邏輯地址空間,建立映射到想訪悶的那段物理內(nèi)存(即填充內(nèi)核PTE頁(yè)面表),臨時(shí)用一會(huì),用完后歸還。這樣別人也nj_以借川這段地址空間訪問(wèn)其他物理內(nèi)存,實(shí)現(xiàn)了使川有限的地址空間,訪問(wèn)所有所有物玴內(nèi)存。如下圖。內(nèi)核髙端內(nèi)存邏輯地址空間OxF8000000-OxFFFFFFFF0?896MBDRAM896MB?內(nèi)存物理地址空間例如內(nèi)核想訪問(wèn)2G開始的一段大小為1MB的物理內(nèi)存,即物理地址范圍為0x80000000?0X800FFFFF。訪問(wèn)之前先找到一段1MB人小的
7、空閑地址空間,假設(shè)找到的空閑地址空間為0XF8700000?0XF87FFFFF,用這1MB的邏輯地址空間映射到物理地址空間0x80000000?0X800FFFFF的內(nèi)存。映射關(guān)系如下:邏輯地址物理內(nèi)存地址OXF87000000x800000000XF87000010x800000010XF87000020x80000002……0XF87FFFFF0X800FFFFF當(dāng)內(nèi)核訪問(wèn)完0x80000000?0X800FFFFF物理內(nèi)存后,就將0xF8700000?0XF87FFFFF閃核線性空間釋放。這樣其他進(jìn)程或代碼也可以使用0xF8700000?
8、0XF87FFFFF這段地址訪問(wèn)其他物理內(nèi)存。從上面的描述,我們可以知道髙端內(nèi)存的最基本思想:借一段地址空間,建立臨吋地址映射,用完后釋