#
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標誌 什麼時候使用哪種標誌?如下 ...