[教育訓練紀錄] 呼叫 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 與可重覆進入函數

Jollen's Blog 使用 Github issues 與讀者交流討論。請點擊上方的文章專屬 issue,或 open a new issue

您可透過電子郵件 jollen@jollen.org,或是 Linkedin 與我連絡。更歡迎使用微信,請搜尋 WeChat ID:jollentw