1. 程式人生 > >Kmalloc和Vmalloc的區別

Kmalloc和Vmalloc的區別

def atomic 動態加載 模塊 獲得 了解 sta 微處理器 ive

kmalloc()和vmalloc()介紹
kmalloc()
用於申請較小的、連續的物理內存
1. 以字節為單位進行分配,在<linux/slab.h>中
2. void *kmalloc(size_t size, int flags) 分配的內存物理地址上連續,虛擬地址上自然連續
3. gfp_mask標誌
:什麽時候使用哪種標誌?如下:
———————————————————————————————-
情形 相應標誌
———————————————————————————————-
進程上下文,可以睡眠 GFP_KERNEL
進程上下文,不可以睡眠 GFP_ATOMIC
中斷處理程序 GFP_ATOMIC
軟中斷 GFP_ATOMIC
Tasklet GFP_ATOMIC
用於DMA的內存,可以睡眠 GFP_DMA | GFP_KERNEL
用於DMA的內存,不可以睡眠 GFP_DMA | GFP_ATOMIC
———————————————————————————————-
4. void kfree(const void *ptr)
釋放由kmalloc()分配出來的內存塊


vmalloc()
用於申請較大的內存空間,虛擬內存是連續的
1. 以字節為單位進行分配,在<linux/vmalloc.h>中
2. void *vmalloc(unsigned long size) 分配的內存虛擬地址上連續,物理地址不連續
3. 一般情況下,只有硬件設備才需要物理地址連續的內存,因為硬件設備往往存在於MMU之外,根本不了解虛擬地址;但為了性能上的考慮,內核中一般使用 kmalloc(),而只有在需要獲得大塊內存時才使用vmalloc(),例如當模塊被動態加載到內核當中時,就把模塊裝載到由vmalloc()分配 的內存上。
4.void vfree(void *addr),這個函數可以睡眠,因此不能從中斷上下文調用。


malloc(), vmalloc()和kmalloc()區別
[*]kmalloc和vmalloc是分配的是內核的內存,malloc分配的是用戶的內存
[*]kmalloc保證分配的內存在物理上是連續的,vmalloc保證的是在虛擬地址空間上的連續,malloc不保證任何東西(這點是自己猜測的,不一定正確)
[*]kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相對較大
[*]內存只有在要被DMA訪問的時候才需要物理上連續
[*]vmalloc比kmalloc要慢

kmalloc()與vmalloc()的區別

kmalloc()與vmalloc() 都是在內核代碼中提供給其他子系統用來分配內存的函數,但二者有何區別?

從前面的介紹已經看出,這兩個函數所分配的內存都處於內核空間,即從3GB~4GB;但位置不同,kmalloc()分配的內存處於3GB~high_memory之間,而vmalloc()分配的內存在VMALLOC_START~4GB之間,也就是非連續內存區。一般情況下在驅動程序中都是調用kmalloc()來給數據結構分配內存,而vmalloc()用在為活動的交換區分配數據結構,為某些I/O驅動程序分配緩沖區,或為模塊分配空間,例如在include/asm-i386/module.h中定義了如下語句:

#define module_map(x) vmalloc(x)

其含義就是把模塊映射到非連續的內存區。

kmalloc()和vmalloc()相對應,兩個釋放內存的函數為kfree()和vfree()。

kmalloc和vmalloc是分配的是內核的內存,malloc分配的是用戶的內存
kmalloc保證分配的內存在物理上是連續的,vmalloc保證的是在虛擬地址空間上的連續
kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相對較大
內存只有在要被DMA訪問的時候才需要物理上連續
vmalloc比kmalloc要慢

1)kmalloc分配的物理地址與虛擬地址只有一個PAGE—OFFSET偏移,不需要為地址段修改頁表。

Vmalloc類函數地址完全虛擬,每次分配都需要對頁表進行設置,當然效率低。
2)vmalloc使用的正確場合是分配一大塊,連續的,只在軟件中存在的,用於緩沖的內存區域。不能在微處理器之外使用。
3)vmalloc 中調用了 kmalloc (GFP—KERNEL),因此也不能應用於原子上下文。

kmalloc和 kfree管理內核段內分配的內存,這是真實地址已知的實際物理內存塊。vmalloc和vfree是對內核使用的虛擬內存進行分配和釋放。 kmalloc返回的內存是物理的,連續的,更適合於類似設備驅動的程序來使用。但vmalloc能使用更多的資源,因為vmalloc還可以處理交換空 間。

kmalloc()分配的內存在0xBFFFFFFF-0xFFFFFFFF以上的內存中,driver一般是用它來完成對DS的分配
vmalloc()則是位於物理地址非連續,虛地址連續區,起始位置由VMALLOL_START來決定,一般作為交換區、模塊的分配

kmalloc對應於kfree,可以分配連續的物理內存;
vmalloc對應於vfree,分配連續的虛擬內存,但是物理上不一定連續。


vmalloc分配內存的時候邏輯地址是連續的,但物理地址一般是不連續的,適用於那種一下需要分配大量內存的情況,如insert模塊的時候。這種分配方式性能不入kmalloc。

kmalloc分配內存是基於slab,因此slab的一些特性包括著色,對齊等都具備,性能較好。物理地址和邏輯地址都是連續的


最主要的區別是

分配大小的問題。
比如你需要28個字節,那一定用KMALLOC,如果用VMALLOC,分配不多次機器就罷工了

Kmalloc和Vmalloc的區別