2013年8月12日 星期一

[轉] linux 筆記 關於struct file 結構下 private_data 數據結構的思考

    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; /*for other methods*/
(container_of這個宏返回的是地址,即結構體的地址)
  也可以使用C語言中的一些技巧實現地址的賦值
 struct s3c2440_camif *dev =&camif;
 file->private_data = dev;  

沒有留言:

張貼留言