LInux裝置驅動分析—— kmalloc和kzalloc函式
今晚在研究EVM5728開發板上面Linux系統的IIC裝置驅動程式,偶然之間看到驅動程式中有一處使用了kzalloc函式,本人之前都是使用Linux核心提供的kmalloc / kfree函式來給裝置相關結構體分配 / 釋放記憶體的,第一次看到kzalloc函式的使用,因此覺得很好奇,於是乎google了一下這個函式的用法,並與kmalloc函式進行了對比,順便記錄一下,方便以後學習查詢。
首先,先看下面這個驅動程式的裝置檢測函式,在該函式的第10行呼叫了一個kzalloc函式給yyy_data這個結構體分配了記憶體,
我查詢了網上資料,找到了kzalloc函式的原型和定義,如下圖所示:
從函式定義我們可以看出,該函式接收了兩個引數,第一個引數size表示需要分配多少位元組的記憶體,該引數由呼叫者提供,而第二個引數是gtp_t 型別的引數,用於控制記憶體的分配策略,該引數與kmalloc函式的第二個引數是相同的,使用者通過設定該引數可以控制核心的記憶體分配策略。關於該引數的使用後面再作具體分析。
我們從函式定義還可以看出,kzalloc函式實際上是呼叫了kmalloc函式,只不過在傳遞引數時將接收的flags 與GFP_ZERO標誌相或再傳給kmalloc函式。通過這一點,我們可以得知kzalloc函式的作用是呼叫kmalloc函式分配記憶體並將獲得的記憶體進行清零(呼叫memset函式初始化為0),本質上是對kmalloc的封裝,通過該函式分配的記憶體是已經初始化的,程式中可以直接使用,而直接呼叫kmalloc函式分配的記憶體塊並沒有初始化,裡面的資料是不可用的。kzalloc函式的使用與kmalloc類似,都需要包含<linux/slab.h> 標頭檔案。
另外,需要說明一下,__GFP_ZERO標誌是定義在 <linux/gfp.h> 標頭檔案中的巨集定義,該標誌表示給分配的記憶體塊清零,在該檔案中還定義了其他的巨集,都可以用於控制kzalloc和kmalloc函式的記憶體分配行為。
第二個引數的說明
關於kzalloc和kmalloc函式的第二個引數,根據Linux核心文件的說明,該引數可以用來控制核心分配記憶體的行為,如是否睡眠等,也可以控制核心從哪裡分配記憶體,需要使用定義在 <linux/gfp.h>的巨集,有興趣的同學可以看看以下的參考資料:
https://blog.csdn.net/u010709783/article/details/77712311
下面是我正在看的驅動程式,從程式就可以看出kzalloc函式的使用:
參考資料
1. 《Linux核心設計與實現》第三版
2. https://blog.csdn.net/xujianqun/article/details/6715243