在設(shè)備驅(qū)動(dòng)程序或者內(nèi)核模塊中動(dòng)態(tài)開辟內(nèi)存,不是用malloc,而是kmalloc ,vmalloc,釋放內(nèi)存用的是kfree,vfree,kmalloc函數(shù)返回的是虛擬地址(線性地址). kmalloc特殊之處在于它分配的內(nèi)存是物理上連續(xù)的,這對(duì)于要進(jìn)行DMA的設(shè)備十分重要. 而用vmalloc分配的內(nèi)存只是線性地址連續(xù),物理地址不一定連續(xù),不能直接用于DMA。
vmalloc函數(shù)的工作方式類似于kmalloc,只不過(guò)前者分配的內(nèi)存虛擬地址是連續(xù)的,而物理地址則無(wú)需連 續(xù)。通過(guò)vmalloc獲得的頁(yè)必須一個(gè)一個(gè)地進(jìn)行映射,效率不高, 因此,只在不得已(一般是為了獲得大塊內(nèi)存)時(shí)使用。vmalloc函數(shù)返回一個(gè)指針,指向邏輯上連續(xù)的一塊內(nèi)存區(qū),其大小至少為size。在發(fā)生錯(cuò)誤 時(shí),函數(shù)返回NULL。vmalloc可能睡眠,因此,不能從中斷上下文中進(jìn)行調(diào)用,也不能從其它不允許阻塞的情況下調(diào)用。要釋放通過(guò)vmalloc所獲 得的內(nèi)存,應(yīng)使用vfree函數(shù)
vmalloc和kmalloc的分配內(nèi)存的特點(diǎn)大概如下:
區(qū)別大概可總結(jié)為:
1,vmalloc分配的一般為高端內(nèi)存,只有當(dāng)內(nèi)存不夠的時(shí)候才分配低端內(nèi)存;kmallco從低端內(nèi)存分配。
2,vmalloc分配的物理地址一般不連續(xù),而kmalloc分配的地址連續(xù),兩者分配的虛擬地址都是連續(xù)的;
3,vmalloc分配的一般為大塊內(nèi)存,而kmaooc一般分配的為小塊內(nèi)存,(一般不超過(guò)128k);
聯(lián)系客服