struct file是字元裝置驅動相關重要結構。struct file代表一個打開的檔案描述符,它不是專門給驅動程式使用的,系統中每一個打開的檔案在核心中都有一個關聯的 struct file。 它由核心在 open時建立,并傳遞給在檔案上操
作的任何函數,知道最後關閉。當檔案的所有執行個體都關閉之後,核心釋放這個資料結構。
在 struct filed有個成員void *private_data;文檔上說明該成員是系統調用時儲存狀态資訊非常有用的資源。起初一直不明白這個private_data在驅動 open函數中的作用,後來發現private_data 這個成員在open函數被調用的時候 linux 系統就已經将其幅值為NULL,之後可供使用者使用,或者比較悲劇的被使用者忽略改域。
在詳細的閱讀源代碼後,發現 這個private_data 其實是用來儲存自定義裝置結構體的位址的。自定義結構體的位址被儲存在private_data後,可以在read ,write 等驅動函數中被傳遞和調用自定義裝置結構體中的成員。
例如 可以在open函數中這麼做
struct scull_dev *dev;
dev = container_of(inode->i_cdev,struct scull_dev,cdev);
filp->private_data = dev;
(container_of這個宏傳回的是位址,即結構體的位址)
也可以使用C語言中的一些技巧實作位址的指派
struct s3c2440_camif *dev =&camif;
file->private_data = dev;