1 kmalloc和 vmalloc
都是以字節爲單位分配內存
kmalloc分配的內存都是位於3GB~high memory之間,這段內核空間與物理內存一一映射,即差爲一固定值,vmalloc 分配的內存空間在VMALLOC_START~4GB之間,虛擬地址上連續物理地址上不一定連續.
一般情況下,只有硬件設備才需要物理地址連續的內存,因爲硬件設備往往存在於MMU之外,不瞭解虛擬內存,但爲了性能上的考慮,內核中一般使用kmalloc只有需要獲得較大的內存時用vmalloc(kamalloc分配內存小於128kb),例如模塊被動態加載到內核當中時,就把模塊裝載到vmalloc分配的內存上。
使用kmalloc需使用GFP_標識,kmalloc會通過__get_free_pages進行,類型如下
GFP_KERNEL 用於進程上下文,內存不足時可以睡眠,等待空閒頁的出現。
GFP_ATOMIC 用於不可以睡眠進程的上下文,如中斷,或軟中斷
GFP_DMA從ZONE_DMA進行分配,常和第一二個標識一起使用。
GFP_USER爲用戶空間分配內存,可能睡眠
GFP_HIGHUSER首先試圖從ZONE_HIGHMEM分配,若分配不到,嘗試從ZONE_NORMAL和ZONE_DMA分配
GFP_NOIO類同於GFP_KERNEL但在試圖獲取內存時不允許進行任何I/O操作
GFP_NOFS類同於GFP_KERNEL,但在試圖獲取內存時不允許進行文件系統調用
GFP_NOWAIT分配過程不會睡眠。
標示符在linux/gfp.h
2 按頁分配
get_zeroed_page(unsigned int flags);
__get_free_page(unsigned int flags);
__get_free_pages(unsigned int flags,ubsigned int order);
釋放頁void free_page(unsigned long addr);
void free_pages(unsigned long addr,unsigned long order);