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。核心用於確保連續的物理記憶體空間。通過在物理儲存器上確保連續的區域,可以獲得空間區域性...