file结构
file结构是设备驱动程序所使用的另一个重要的数据结构,它代表一个“打开的文件”,是应用程序在进行open()调用时由内核创建的,在进行close()调用时作为参数传递给函数以关闭相应的文件。在文件关闭后,内核释放这个数据结构。file结构也在include/linux/fs.h中定义。
include/linux/fs.h
519 struct file{
520 struct list_head f_list;
521 struct dentry *f_dentry;
522 struct vfsmount *f_vfsmnt;
523 struct file_operations *f_op;
524 atomic_t f_count;
525 unsigned int f _flags;
526 mode_t f_mode;
527 loff_t f_pos;
528 unsigned long f_reada,f_ramax,f_ralen,f_rawin;
529 struct fown_struct f_owner;
530 unsigned int f_uid,f_gid;
531 int f_error;
532
533 unsigned long f_version;
534
535 /*needed for ttry driver,and maybe others*/
536 void *private_data;
537
538 /*preallocated helper kiobuf to speedup O_DIRECT*/
539 struct kiobuf *f_iobuf;
540 long f_iobuf_lock;
541 };
由于驱动程序不填写file结构,只是简单地访问其他地方创建的结构,因此常用的并不多,下面介绍驱动程序常用的成员。
1. f_mode
该成员表示文件的读写权限,由FMODE_READ和FMODE_WRUTE标识。驱动程序的ioctl()方法可能需要查看这个域来检查读写权限。由于内核在调用驱动程序的read()和write()方法已检查了权限,因此read()和write()方法无需检查读写权限。
2. f_ops
该成员表示文件的当前读/写位置。驱动程序科直接读写该字段。
3. f_flags
该成员是文件标志,如O_RDONLY、O_NONBLOCK、O_SYNC,所有这些标志都在include/linux/fcntl.h中定义。标志O_NONBLOCK表示是否是请求非阻塞型操作,可由驱动程序检查,其他标志很少使用,需要注意的是,读写权限的检查应该看f_mode成员而不是f_flags成员。
4. f_inode
该成员是设备文件对应的i结点。驱动程序除了可以通过对该字段从设备号外一般不适用该字段。
5. f_op
该成员表示与文件关联。内核在完成open()时对这个指针赋值,以后需要分派操作时就读这些数据。file->f_op中的值从不保存共以后引用,因此可在需要时修改文件所对应的操作,下一次再操作那个打开文件的相关操作时会调用新方法。这种技巧有助于在不增加系统调用负担的情况下方便识别主设备号相同的设备。
6. private_data
系统调用open()在调用驱动程序的open()方法之前将这个指针置为NULL。驱动程序可将这个字段用于任意目的或者简单忽略这个字段,驱动程序可用这个字段指向已分配的数据,但一定要在内核释放file结构前的release()方法中清除它。