linux内存管理——kmalloc和vmalloc
直接映射區(qū):線性空間中從3G開(kāi)始最大896M的區(qū)間,為直接內(nèi)存映射區(qū),該區(qū)域的線性地址和物理地址存在線性轉(zhuǎn)換關(guān)系:線性地址=3G+物理地址。
動(dòng)態(tài)內(nèi)存映射區(qū):該區(qū)域由內(nèi)核函數(shù)vmalloc來(lái)分配,特點(diǎn)是:線性空間連續(xù),但是對(duì)應(yīng)的物理空間不一定連續(xù)。vmalloc分配的線性地址所對(duì)應(yīng)的物理頁(yè)可能處于低端內(nèi)存,也可能處于高端內(nèi)存。
永久內(nèi)存映射區(qū):該區(qū)域可訪問(wèn)高端內(nèi)存。訪問(wèn)方法是使用alloc_page(_GFP_HIGHMEM)分配高端內(nèi)存頁(yè)或者使用kmap函數(shù)將分配到的高端內(nèi)存映射到該區(qū)域。
固定映射區(qū):該區(qū)域和4G的頂端只有4k的隔離帶,其每個(gè)地址項(xiàng)都服務(wù)于特定的用途,如ACPI_BASE等。
1.內(nèi)核的線性地址空間
進(jìn)程的4GB內(nèi)存空間被人為的分為兩個(gè)部分--用戶空間與內(nèi)核空間。用戶空間地址分布從0到3GB(PAGE_OFFSET,在0x86中它等于0xC0000000),3GB到4GB為內(nèi)核空間。
內(nèi)核空間中,從3G到vmalloc_start這段地址是物理內(nèi)存映射區(qū)域(該區(qū)域中包含了內(nèi)核鏡像、物理頁(yè)框表mem_map等等)。在物理內(nèi)存映射區(qū)之后,就是vmalloc區(qū)域。對(duì)于 160M的系統(tǒng)而言,vmalloc_start位置應(yīng)在3G+160M附近(在物理內(nèi)存映射區(qū)與vmalloc_start期間還存在一個(gè)8M的gap 來(lái)防止躍界),vmalloc_end的位置接近4G(最后位置系統(tǒng)會(huì)保留一片128k大小的區(qū)域用于專用頁(yè)面映射)kmalloc和get_free_page申請(qǐng)的內(nèi)存位于物理內(nèi)存映射區(qū)域,而且在物理上也是連續(xù)的,它們與真實(shí)的物理地址只有一個(gè)固定的偏移.
vmalloc申請(qǐng)的內(nèi)存則位于vmalloc_start~vmalloc_end之間,與物理地址沒(méi)有簡(jiǎn)單的轉(zhuǎn)換關(guān)系,雖然在邏輯上它們也是連續(xù)的,但是在物理上它們不要求連續(xù)
2.物理內(nèi)存空間的布局
linux把每個(gè)節(jié)點(diǎn)的物理內(nèi)存劃分為3個(gè)管理區(qū)(zone):ZONE_DMA(低于16MB的內(nèi)存頁(yè)框), ZONE_NORMAL(16MB~896MB的內(nèi)存頁(yè)框), ZONE_HIGHMEM(高于896MB的內(nèi)存頁(yè)框)
vmalloc和kmalloc區(qū)別
1,kmalloc對(duì)應(yīng)于kfree,分配的內(nèi)存處于3GB~high_memory之間,這段內(nèi)核空間與物理內(nèi)存的映射一一對(duì)應(yīng),可以分配連續(xù)的物理內(nèi)存; vmalloc對(duì)應(yīng)于vfree,分配的內(nèi)存在VMALLOC_START~4GB之間,分配連續(xù)的虛擬內(nèi)存,但是物理上不一定連續(xù)。
2,vmalloc() 分配的物理地址無(wú)需連續(xù),而kmalloc() 確保頁(yè)在物理上是連續(xù)的?
3,kmalloc分配內(nèi)存是基于slab,因此slab的一些特性包括著色,對(duì)齊等都具備,性能較好。物理地址和邏輯地址都是連續(xù)的。?
4,最主要的區(qū)別是分配大小的問(wèn)題,比如你需要28個(gè)字節(jié),那一定用kmalloc,如果用vmalloc,分配不多次機(jī)器就罷工了。?
??? 盡管僅僅在某些情況下才需要物理上連續(xù)的內(nèi)存塊,但是,很多內(nèi)核代碼都調(diào)用kmalloc(),而不是用vmalloc()獲得內(nèi)存。這主要是出于性能的考慮。vmalloc()函數(shù)為了把物理上不連續(xù)的頁(yè)面轉(zhuǎn)換為虛擬地址空間上連續(xù)的頁(yè),必須專門建立頁(yè)表項(xiàng)。還有,通過(guò) vmalloc()獲得的頁(yè)必須一個(gè)一個(gè)的進(jìn)行映射(因?yàn)樗鼈兾锢砩喜皇沁B續(xù)的),這就會(huì)導(dǎo)致比直接內(nèi)存映射大得多的緩沖區(qū)刷新。因?yàn)檫@些原因,vmalloc()僅在絕對(duì)必要時(shí)才會(huì)使用,最典型的就是為了獲得大塊內(nèi)存時(shí),例如,當(dāng)模塊被動(dòng)態(tài)插入到內(nèi)核中時(shí),就把模塊裝載到由vmalloc()分配的內(nèi)存上。
總結(jié)
以上是生活随笔為你收集整理的linux内存管理——kmalloc和vmalloc的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: IO模型(select, poll, e
- 下一篇: Linux下select, poll和e