[教育訓練紀錄] 呼叫 kmalloc(GFP_KERNEL) 的函數要可以重覆進入

jollen 發表於 June 22, 2008 10:10 AM

使用 kmalloc() 時,要特別注重的是「可重覆進入」的觀念。kmalloc() 的第二個參數稱為 allocation flag,用來控制 kmalloc() 的行為,當此參數有指定 GFP_KERNEL 旗標時,kmalloc() 就是一個 blocking function。

使用 GFP_KERNEL 旗標來配置記憶體時,為什麼會有可重覆進入的議題呢?主要的關鍵在於,當 kmalloc(..., GFP_KERNEL) 無法配置記憶體時,便會做「等待」的動作,這個等待的動作是對「current process」做重排程,並等候記憶體空間。

以 open driver function 來看,通常我們會在 open driver function 裡做記憶體的配置,當記憶體目前無法取得時,open driver function 便會停止(等待),因此不會完成這一次的函數呼叫(沒有 return),此時,同一個 open driver function 會不會再被「重覆」呼叫執行呢?當然會。因為,可能會有另一個 process 去開啟 major number 相同的裝置檔,因此,同一個 open driver function 又被呼叫了,但是前一次的呼叫卻還在等待。

當函數第二次被呼叫時,第一次的呼叫還沒有結束執行,所以,函數「重覆」進來執行了。

延伸閱讀

2008.04.20: [教育訓練紀錄] 關於驅動程式的 private data 與可重覆進入函數

讀者留言 (4)

  • allen 於 April 7, 2014 09:33:

    在网路上搜到您的博客,最近我开始学习linux kernel,但是觉得还是比较困难,看源码看的很吃力,想请问下如何入门呢?谢谢!

  • allen 於 April 7, 2014 09:33:

    在网路上搜到您的博客,最近我开始学习linux kernel,但是觉得还是比较困难,看源码看的很吃力,想请问下如何入门呢?谢谢!

  • allen 於 April 7, 2014 09:33:

    在网路上搜到您的博客,最近我开始学习linux kernel,但是觉得还是比较困难,看源码看的很吃力,想请问下如何入门呢?谢谢!

  • allen 於 April 7, 2014 09:33:

    在网路上搜到您的博客,最近我开始学习linux kernel,但是觉得还是比较困难,看源码看的很吃力,想请问下如何入门呢?谢谢!

留言功能維護中。將於近日重新開放。

連絡作者

Jollen Chen,Moko365(仕橙3G教室)講師,熱愛研究 Linux 與 Android 技術。曾為 Motorola、HTC、Foxconn、LG、OPPO、騰迅、廣達電腦、緯創、仁寶等超過 50 家企業講授課程。目前在 MokoVersity 擔任軟體工程師,撰寫 Node.js 程式,也在幾家科技廠兼任 Android Framework 研發顧問。您可透過電子郵件 <jollen (at) jollen (dot) org> 或這裡與我連絡。