今晚在研究EVM5728開發板上面Linux系統的IIC設備驅動程序,偶然之間看到驅動程序中有一處使用了kzalloc函數,本人之前都是使用Linux內核提供的kmalloc / kfree函數來給設備相關結構體分配 / 釋放內存的,第一次看到kzalloc函數的使用,因此覺得很好奇,於是乎google了一下這個函數的用法,並與kmalloc函數進行了對比,順便記錄一下,方便以后學習查詢。
首先,先看下面這個驅動程序的設備檢測函數,在該函數的第10行調用了一個kzalloc函數給yyy_data這個結構體分配了內存,並返回一個yyy_data類型的指針並賦值給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