open、release、
read、
write還記得這些file_operations中的函式指標麼?靜靜地實現他們吧。
1、open方法
原型: int (*open)(struct inode *inode, struct file *filp);
任務:檢查裝置特定錯誤;如果裝置首次開啟,對其進行初始化;必要時,更新f_op指標;分配並填寫置於filp->private_data裡的資料結構;
2、release方法
原型: int (*release) (struct inode *, struct file *);
任務:open方法的逆操作
(1)釋放由open分配的、儲存在filp->private_data中的所有內容;
(2)在最後一次關閉操作時關閉裝置;
個人認為謹記release中要做一些free操作是很有必要的。不知道你有沒有,反正我經常是malloc後忘記free,很臭的乙個毛病。
3、read & write
ssize_t read(struct file *filp, char __user *buff, size_t count, loff_t *offp);
ssize_t write(struct file *filp, const char __user *buff, size_t count, loff_t *offp);
page 70、71中read 、write 方法的實現對於初學者來說,理解是比較困難的。本質上read、write 方法實現了copy_to_user、copy_from_user。理解的時候,可以根據使用者層的read write方法對比來看。每乙個引數都是一一對應的。
#include
unsigned long copy_to_user(void __user *to, const void *from, unsigned long count); //read實現
unsigned long copy_from_user(void *to, const void __user *from, unsigned long count); //write實現
以下是我的read、write簡單實現,以及對應使用者層的read 、write 呼叫;你可以新增到自己的**中執行看看。其中返回值並沒有做處理,只是為了簡要說明其功能。在驅動中後續會常用這兩方法,後續完善(其實是有點犯懶了)
81 size_t scull_read(struct file *filp, char __user *buf, size_t count, loff_t *f_ops)
82 91 size_t scull_write(struct file *filp, char __user *buf, size_t count, loff_t *f_ops)
92
15 read(fd, buff, 20);
16 puts(buff);
18 write(fd, buff, 10);
字元裝置驅動1 乙個簡單的字元裝置驅動示例
1.註冊主次裝置號 register chrdev region 和 alloc chrdev region 2.註冊字元裝置驅動 cdev init 初始化,cdev add 新增,註冊裝置驅動,cdev alloc 申請空間,cdev del 登出驅動 3.建立驅動的裝置檔案 class cre...
linux簡單字元裝置驅動
os ubuntu 12.04 如果是用交叉編譯器,只需要修改makefile中的kernel所在路徑即可。下面貼出乙個簡單的字元裝置驅動例子 include include include include include include include define name test stati...
裝置驅動例項 字元裝置驅動
在整個linux裝置驅動學習中,字元裝置驅動較為基礎。通過對它的學習,對裝置驅動進一步加深了解 cdev 結構體struct cdev 講下比較重要的成員變數 dev t dev 定義了32位的裝置號,其中12位是主裝置號,20位是從裝置號。獲取主裝置號 major dev t dev 獲取從裝置號...