Kmalloc和Vmalloc的區別

2021-08-21 10:04:29 字數 3074 閱讀 1079

kmalloc()和vmalloc()介紹

kmalloc()

用於申請較小的、連續的物理記憶體

1. 以位元組為單位進行分配,在中

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.以位元組為單位進行分配,在中

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的區別

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獲取虛擬位址,但它們具有以下差異。kmaloc以物件為單位 slab 獲取。該快取是以8,16,32,4096,8192大小建立的,用於kmaloc,並獲取引數指定大小的相應slab。核心用於確保連續的物理記憶體空間。通過在物理儲存器上確保連續的區域,可以獲得空間區域性...