kmalloc和vmalloc的區別

2021-10-22 03:36:48 字數 1522 閱讀 6463

#

include

void

*kmalloc

(size_t size ,

int flags)

;//使用kfree();釋放記憶體

其中flags引數有必要講一下:一般**中會用gfp_kernel和gfp_atomic兩種。

gfp_kernel 常規的分配標誌,可能會阻塞,但並不是始終使用。

gfp_atomic 這個標誌用在中斷處理程式、下半部、持有自旋鎖以及其他不能睡眠的地方。

注意:kmalloc能夠分配的記憶體塊大小,存在乙個上限。

kzalloc()

用kzalloc申請記憶體的時候,效果等同於先是用kmalloc()申請空間,然後用memset()來初始化,所有申請的元素都被初始化為0.

static

inline

void

*kzalloc

(size_t size,

gfp_t flags)

{return

kmalloc

(size, flags | __gfp_zero)

;

vmalloc()

#

include

void

*vmalloc

(unsigned

long size)

;//使用vfree();釋放記憶體

順帶提一句,kmalloc和vmalloc分配的是核心的記憶體,malloc分分配的是使用者的記憶體。

對於提供了mmu的處理器而言,linux提供了複雜的儲存管理系統,使得程序所能訪問的記憶體達到4gb。程序的4gb記憶體空間被人為的分為兩個部分:使用者空間與核心空間。使用者空間位址分布從0到3gb(page_offset,在0x86中它等於0xc0000000),3gb到4gb為核心空間。

核心空間中,從3g到vmalloc_start這段位址是物理記憶體對映區域(該區域中包含了核心映象、物理頁框表mem_map等等),比如vmware虛擬系統記憶體是160m,那麼3g~3g+160m這片記憶體就應該對映物理記憶體。在物理記憶體對映區之後,就是vmalloc區域。

對於160m的系統而言,vmalloc_start位置應在3g+160m附近(在物理記憶體對映區與vmalloc_start期間還存在乙個8m的gap來防止躍界),vmalloc_end的位置接近4g(最後位置系統會保留一片128k大小的區域用於專用頁面對映),

kmalloc和get_free_page申請的記憶體位於物理記憶體對映區域,而且在物理上也是連續的,它們與真實的實體地址只有乙個固定的偏移,因此存在較簡單的轉換關係,virt_to_phys()可以實現核心虛擬位址轉化為實體地址

Kmalloc和Vmalloc的區別

kmalloc 和vmalloc 介紹 kmalloc 用於申請較小的 連續的物理記憶體 1.以位元組為單位進行分配,在中 2.void kmalloc size t size,int flags 分配的記憶體實體地址上連續,虛擬位址上自然連續 3.gfp mask標誌 什麼時候使用哪種標誌?如下 ...

Kmalloc和Vmalloc的區別

kmalloc 和vmalloc 介紹 kmalloc 用於申請較小的 連續的物理記憶體 1.以位元組為單位進行分配,在中 2.void kmalloc size t size,int flags 分配的記憶體實體地址上連續,虛擬位址上自然連續 3.gfp mask標誌 什麼時候使用哪種標誌?如下 ...

Kmalloc和Vmalloc的區別

kmalloc 和vmalloc 介紹 kmalloc 用於申請較小的 連續的物理記憶體 1.以位元組為單位進行分配,在中 2.void kmalloc size t size,int flags 分配的記憶體實體地址上連續,虛擬位址上自然連續 3.gfp mask標誌 什麼時候使用哪種標誌?如下 ...