核心 驅動 字元裝置驅動程式 3

2021-08-27 12:26:45 字數 2725 閱讀 4039

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...