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

jollen 發表於 April 20, 2008 5:09 PM

今天進行 Linux 驅動程式的教育訓練課程,課堂中提到「多個 process (/dev/debug[0..n]) 同時 invoke 同一個驅動程式 (fops) 的架構觀念與程式設計」,我們也做了一個課堂練習。這是 Linux 驅動程式架構上,很重要的一個觀念。

Private Data and Reentrant Function

如圖,當 P 與 Q 二個 process 同時在系統裡執行時,因為開啟的裝置檔不同,因此 kernel(VFS switch)會分別為二個裝置檔建立一個 struct file 的資料結構空間。因為二個裝置檔的 major number 相同,因此如果 P/Q 同時(或非同時)執行 write system call 時,都會引用(invoke)到同一份程式碼(即圖上的 xxx_write)。

VFS Switch 在 callback xxx_write 時,便會將「正確的」struct file 結構傳給a write driver function,即圖中的 filp 指標。如此一來,xxx_write 函數便能「重覆進入」:computation code 一份,但有二份獨立的 data (memory space)。

struct file 裡設計了一個稱為 private_data 的欄位,用來指向「私有資料」,即保存個別 user process 狀態的資料結構。這是在 Linux 驅動程式中很常見的程式結構,當然也是一個「不可不懂」的觀念。`

延伸閱讀

* 2006.09.20: 一篇有關 Reentrant Code Program (可重覆進入程式碼) 的文章


讀者留言 (0)

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

連絡作者

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