globalvar_write函数中内核空间与用户空间的内存交互需要借助第2节所介绍的函数:
static ssize_t globalvar_write(struct file *filp, const char *buf, size_t len, loff_t *off) { … copy_from_user(&global_var, buf, sizeof(int)); … } |
ioctl() 函数 该函数是特殊的控制函数,可以通过它向设备传递控制信息或从设备取得状态信息,函数原型为:
int (*ioctl) (struct inode * ,struct file * ,unsigned int ,unsigned long); |
unsigned int参数为设备驱动程序要执行的命令的代码,由用户自定义,unsigned long参数为相应的命令提供参数,类型可以是整型、指针等。如果设备不提供ioctl 入口点,则对于任何内核未预先定义的请求,ioctl 系统调用将返回错误(-ENOTTY,"No such ioctl fordevice,该设备无此ioctl 命令")。如果该设备方法返回一个非负值,那么该值会被返回给调用程序以表示调用成功。
llseek()函数 该函数用来修改文件的当前读写位置,并将新位置作为(正的)返回值返回,原型为:
loff_t (*llseek) (struct file *, loff_t, int); |
poll()函数 poll 方法是poll 和select 这两个系统调用的后端实现,用来查询设备是否可读或可写,或是否处于某种特殊状态,原型为:
unsigned int (*poll) (struct file *, struct poll_table_struct *); |
我们将在"设备的阻塞与非阻塞操作"一节对该函数进行更深入的介绍。
设备"gobalvar"的驱动程序的这些函数应分别命名为gobalvar_open、gobalvar_ release、gobalvar_read、gobalvar_write、gobalvar_ioctl,因此设备"gobalvar"的基本入口点结构变量gobalvar_fops 赋值如下:
struct file_operations gobalvar_fops = { read: gobalvar_read, write: gobalvar_write, }; |
上述代码中对gobalvar_fops的初始化方法并不是标准C所支持的,属于GNU扩展语法。