第6章 高级字符驱动操作

一、ioctl接口

函数原型:

int ioctl(int fd, unsigned long cmd, ...);

ioctl驱动方法有和用户空间版本不同的原型:

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

为帮助程序员创建唯一的ioctl命令代码,这些编码已被划分为几个段位,Linux的第一个版本使用16-位数:

高8位是关联这个设备的“魔”数,低8位是一个顺序号,在设备内唯一。

根据Linux内核管理来选择驱动ioctl号,在include/asm/ioctl.h和Documentation/ioctl-number.txt文件列举了在内核中使用的魔数。

定义ioctl命令号的正确方法使用4个位段,新富豪定义在<linux/ioctl.h>

type:魔数,只是一个选择数(参考ioctl-number.txt),并且使用它在整个驱动中,8位宽(_IOC_TYPEBITS)

number:序号,它是8位(_IOC_NRBITS)宽

direction:数据传送方向,如果这个特殊的命令设计数据传送。可能的值_IOC_NONE(没有数据传输),_IOC_READ, _IOC_WRITE, IOC_READ|_IOC_WRITE。

size:涉及到的用户数据的大小

头文件<asm/ioctl.h>,它包含在<linux/ioctl.h>中,定义宏来帮助建立命令号。

使用ioctl参数

ioctl调用常常包含小数据项,可通过其他方法更有效的操作。地址校验由函数access_ok,在头文件<asm/uaccess.h>:

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

猜你喜欢

转载自www.cnblogs.com/ch122633/p/9212141.html