05 簡單的字元裝置驅動操作

2021-07-14 02:36:28 字數 1638 閱讀 6238

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 獲取從裝置號...