[教育訓練紀錄] 關於驅動程式的 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 (可重覆進入程式碼) 的文章


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

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