設備驅動的ioctl函數

驅動程序中除了需要具備讀寫的能力外,還需具備對硬件的控制能力。

在用戶空間使用ioctl來控制設備,其原型如下

int ioctl(int fd,usnigned long cmd...)

ioctl 驅動實現方法

int (*ioctl)(struct inode *inode,struct file *filp,unsigned int cmd,unsigned long arg);

不使用BLK(大內核鎖),將使用以下函數指針代替ioctl

long (*unlocked_ioctl)(struct file*,unsigned int,unsigned long);

64位系統使用以下函數指針代替

long (*compat_ioctl)(struct file*,unsigned int,unsigned long);

ioctl 函數定義命令

ioctl命令被分爲幾個段,include/asm/ioctl.h中定義了這些字段:類型(幻數)8,基數8,傳送方向2,參數大小8~14等

命令的方向字段爲兩段

_IOC_NONE	無數據傳輸 
_IOC_READ	讀 
_IOC_WRITE 寫 
_IOC_READ|WRITE雙向 


內核提供下面宏來幫助定義命令:

_IO(type,nr)	//沒有參數的命令 
_IOR(type,nr,datatype)	//從驅動中讀數據 
_IOW(type,nr,datatype)	//寫數據 
_IOWR(type,nr,datatype)	//雙向傳送

還定義了用來解開下列各字段的宏

_IOC_(nr)	//傳輸方向 
_IOC_ TYPE(nr)	//命令類型 
_IOC_NR(nr)	//序號 
_IOC_ SIZE(nr)	//用戶數據大小 

內核中預定義了一些IO控制命令

FIOCLEX:file ioctl close on exec,對文件設置專用標誌,通知內核當exec()系統調用發生時自動關閉打開的文件

FIOCLEX: file ioctl not close on exec與上述相反,清除FIOCLEX命令設置的標誌

FIOQSIZE: 獲得一個文件或者目錄的大小,當用於設備文件時,返回一個ENOTTY錯誤

FIONBIO:file ioctl non-blocking I/O修改在file->f_flags中的O_NONBLOCK標誌

上述宏定義命令的值分別爲0x5450 0x5451 0x5460 0x5421

參數使用,如果是整數,可直接使用,若是地址,需檢測其合法性使用如下函數

int access_ok(int type,const void *addr,unsigned long size) 

第一個參數是VERIFY_READ或者是VERIFY_WRITE用來表明讀用戶內存還是寫用戶內存,addr參數是要操作的地址,size是要操作的長度

返回一個布爾值1是成功,0表示失敗

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章