open和release
open方法
提供給驅動程式以初始化的能力,open方法應完成以下工作
檢查裝置特定的錯誤
如果裝置是首次開啟,則對其進行初始化工作
如有必要,更新f_op元件
分配並填寫置於filp->private_data裡的資料結構
int(
*open)
(struct inode *inode, struct file *filep);
inode: 在其i_cdev欄位中包含了我們想要的資訊
file: 檔案指標
我們指向得到包含某cdev結構體的scull_dev結構體,可以通過以下方法
int(
*open)
(struct inode *inode, struct file *filep);
struct scull_dev *dev;
dev = container_of(inode-
>i_cdev, struct scull_dev, cdev)
;filp -
>private_data = dev;
經過簡化的scuall_open
int scuall_open(struct inode *inode, struct file* filp)
return 0;
}release方法
任務:釋放由open分配的,儲存在file->private_data中的所有內容
在最後一次關閉操作時關閉裝置
int scull_release(struct inode *inode, struct file* filp)
;scull記憶體使用
void *kmalloc(size_t size,
int flags);
試圖分配size個位元組大小的記憶體,其返回值指向該記憶體的指標,分配失敗的時候返回null
flags引數用來描述記憶體的分配方法
void kfree(void *ptr);
釋放kmalloc分配的空間
read和write
ssize_t read(struct file *filp, char __user *buff,
size_t count, loff_t *offp);/
*拷貝資料到應用程式空間*
/ssize_t write(struct file *filp, char __user *buff,
size_t count, loff_t *offp);/
*從應用程式空間拷貝資料*
/filp 是檔案指標
count 是請求傳輸資料的長度
buff 是指向使用者空間的緩衝區
offp 指明使用者在檔案中進行訪問操作的位置(long offset type)
核心**不能直接引用buff中的內容:
使用者空間的位址可能是無效的;
記憶體可能不再ram中,造成oops錯誤
遭到惡意程式開啟後門
使用者位址空間和核心位址空間資料的交換
unsigned long copy_to_user(void __user *to,
const void *from,
unosigned long count);/
*將資料拷貝到使用者空間*
/unsigned long copy_from_user(void *to,
const void __user *from,
unsigned long count);/
*從使用者空間將資料考到核心空間*
/read和write發生錯誤的時候將返回乙個負值
如果返回乙個大於等於0的值則表示成功和操作的資料的位元組數
read方法
呼叫程式對read的返回值的解釋如下
返回值等於count,表示所請求的位元組數成功並完全傳輸
返回值小於count,表示部分資料傳輸成功,傳輸的位元組數小於請求的位元組數
返回值等於0,表示傳輸達到了檔案尾部
返回值小於0,表示發生了錯誤,錯誤碼在
-eintr 系統呼叫被中斷
-efault 無效位址
或者現在還沒有資料,但以後可能會有,read系統呼叫會被阻塞
write方法
呼叫程式對write的返回值的解釋如下
返回值等於count,表示所請求的位元組數成功並完全傳輸
返回值小於count,表示部分資料傳輸成功,傳輸的位元組數小於請求的位元組數
返回值等於0,表示什麼也沒有寫入
返回值小於0,表示發生了錯誤,錯誤碼在
-eintr 系統呼叫被中斷
-efault 無效位址
readv和writev
處理向量的函式
ssize_t (
*readv)
(struct file *filp,
const struct iovec *lov,
unsigned long count, loof_t *ppos);/
* 將指定數量的資料依次讀入每個緩衝區*
/ssize_t (
*writev)
(struct file *filp,
const struct iovec *lov,
unsigned long count, loof_t *ppos)
;/* 把各個緩衝區的內容收集起來, 並將它們在第一次寫入操作中進行輸出 */
struct iovec
;
裝置驅動 字元裝置驅動程式
linux下的應用程式在訪問字元裝置時,一般都是通過裝置檔案訪問的。裝置檔案一般都存放在 dev目錄下。字元裝置檔案的第乙個標誌是c,如下所示 總結 每乙個檔案代表乙個裝置,在時間前面有兩個用逗號隔開的數字,第乙個數字是主裝置號,第二個數字是次裝置號。一般認為乙個主裝置號對應乙個驅動程式,這裡列出的...
linux裝置驅動程式 字元裝置驅動程式
先留個 有一起學習驅動程式的加qq295699450 字元裝置驅動 這篇比較惱火。載入成功,但是讀不出來資料,有知道怎麼回事的,留個言,一起討論下 資料結構 struct scull mem struct scull dev dev 整個驅動程式 如下 include include include...
Linux裝置驅動程式 字元裝置驅動程式
1.檢視主裝置號,次裝置號 進入 dev目錄執行ls l,第四,五列分別為主次裝置號,10,180,1,5,這些是主裝置號,而60,63這些就是次裝置號 130 shell android dev ls l crw rw r system radio 10,60 1969 12 31 21 00 a...