kernel閱讀手記之vmalloc

2021-05-23 12:44:25 字數 2400 閱讀 1140

vmalloc

和kmalloc

的在邏輯位址上時連續的,他們的區別在於

vmalloc

在實體地址上並不時連續的,但是

kmalloc

在實體地址上頁時連續的。

vmalloc

分配分為兩種模式,一種是沒有

mmu(memory management unit,

記憶體管理模組)的

vmalloc

,比如在

arm7

上,另一種則是在有

mmu上的

vmalloc。

在沒有mmu模組支援的

cpu上,

vmalloc

則是呼叫的

slab

中的kmalloc

實現的記憶體分配,其標誌為

(gfp_mask | __gfp_comp) & ~__gfp_highmem

在有mmu

模組的體系架構中的

vmalloc()

,則是通過

__vmalloc_node()

來分配連續邏輯記憶體

__vmalloc_node(unsigned long size, gfp_t gfp_mask, pgprot_t prot,int node, void *caller)

的基本流程如下: 1、

錯誤處理,當待分配的大小為

0,或者將

size/

頁面大小

大於num_physpages

時,返回空 2、

嘗試呼叫

__get_vm_area_node()

獲得虛擬記憶體空間的節點,失敗則返回

null 3、

返回__vmalloc_area_node(area, gfp_mask, prot, node, caller);

的返回值

__vmalloc_area_node(area, gfp_mask, prot, node, caller) 1、

把nr_pages

設定成vmalloc

需要的線形位址的頁面數量 2、

設定array_size

成線形位址的頁面所需要的指標空間的大小 3、

將nr_page

交給area->nr_pages 4、

當array_size

大於頁面大小時,呼叫

__vmalloc_node(array_size, gfp_mask | __gfp_zero,page_kernel, node, caller)

分配空間給

area->pages

。否則,將

kmalloc_node(array_size,(gfp_mask & gfp_reclaim_mask) | __gfp_zero,node)

賦值給area->pages 5、

把caller

的值傳給

area->caller 6、

如果area->pages

分配時,移除

area->addr

中的位址,並且釋放

area

,返回null 7、

遍歷剛分配的頁面,當

node

為負數時,採用

alloc_page(gfp_mask)

為page

分配空間,或者,則利用

alloc_pages_node(node, gfp_mask, 0)

。分配失敗時,將

area->nr_pages

的值設定成

i,釋放掉

area->addr

中位址的使用權,返回

null.

將area_page[i]

設定成剛申請成功的記憶體頁面。當

map_vm_area(area, prot, &pages)

成功對映,返回

area->addr

,否則釋放掉

area_addr

,並返回空值。

在第七步可以知道,

vmalloc

在對記憶體進行分配的時候不是「慷慨」的一次性將記憶體給分配完,而是採用乙個迴圈的方式,多次呼叫

alloc_page()

或者alloc_page_node

對記憶體進行分配。這樣或許可以更加充分的利用記憶體,一些零碎的小記憶體單元可能被利用,但是在速度上就相對於

kmalloc

的速度要慢不少。

kmalloc

針對記憶體緊張的小記憶體單元頁有相應的

slob

的分配方式,甚至在一些不支援

mmu的裝置上

vmalloc

等同於kmalloc

。所以我個人認為在實際核心編碼過程中,更多的使用

kmalloc

會好些。

三十六計閱讀手記

不知道看了之後會不會對敲 有幫助 備周則意怠,常見則不疑。陰在陽之內,不在陽之外。太陽,太陰。共敵不如分敵,敵陽不如敵陰。敵已明,友未定,引友殺敵,不自出力。以 損 推演。困敵之勢,不以戰 損剛益柔。敵之害大,就勢取利,剛決柔也。敵誌亂箤,不虞,坤下兌上之象,利其不自主而取之。誑也,非誑也,實其所誑...

HPUX之Kernel引數管理

hpux下kernel引數設定方法簡單總結整理。命令 kcusage 命令 kctune 沒有什麼可說的,用vi就可以 命令 kconfig d 可以列出到下次reboot會保留的修正的引數 設定config名 kconfig s config名 設定說明 tag kconfig t 這是confi...

《資料之美》手記

資料實際上已經是下一代計算機應用的真正核心。本書中,各位業界精英描述了在他們的專案中如何以全新的方式來駕馭資料的力量。對於任何對資料的未來和問題的解決感興趣的讀者來說,本書都是一部必讀之作 這本書每一篇都講述了乙個不同的專案,說明了其原理 思路 過程及結果。舉個例子,本書中很多章節講述了資料的視覺化...