驅動程序中除了需要具備讀寫的能力外,還需具備對硬件的控制能力。
在用戶空間使用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表示失敗