1. 程式人生 > >LInux裝置驅動分析—— kmalloc和kzalloc函式

LInux裝置驅動分析—— kmalloc和kzalloc函式

       今晚在研究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