Linux驱动file_operations{}结构
在ARM-Linux操作系统的fs.h文件中定义了file_operations结构。
struct file_operations {
struct module *owner;
loff_t (*llseek) (struct file *, loff_t, int);
ssize_t (*read) (struct file *, char *, size_t, loff_t *);
ssize_t (*write) (struct file *, const char *, size_t, loff_t *);
int (*readdir) (struct file *, void *, filldir_t);
unsigned int (*poll) (struct file *, struct poll_table_struct *);
int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
int (*mmap) (struct file *, struct vm_area_struct *);
int (*open) (struct inode *, struct file *);
int (*flush) (struct file *);
int (*release) (struct inode *, struct file *);
int (*fsync) (struct file *, struct dentry *, int datasync);
int (*fasync) (int, struct file *, int);
int (*lock) (struct file *, int, struct file_lock *);
ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *);
ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *);
ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
unsigned long (*get_unmapped_area)(struct file *, unsigned long,
unsigned long, unsigned long, unsigned long);
#ifdef MAGIC_ROM_PTR
int (*romptr) (struct file *, struct vm_area_struct *);
#endif /* MAGIC_ROM_PTR */
};
表6.1描述了file_operations 结构体中主要成员作用。
表6.1 file_operations结构体成员变量
序 号 |
成 员 名 |
描 述 |
1 |
owner |
module 的拥有者。 |
2 |
llseek |
重新定位读写位置。 |
3 |
read |
从设备中读取数据。 |
4 |
write |
向字符设备中写入数据。 |
5 |
readdir |
只用于文件系统,对设备无用。 |
6 |
ioctl |
控制设备,除读写操作外的其他控制命令。 |
7 |
mmap |
将设备内存映射到进程地址空间,通常只用于块设备。 |
8 |
open |
打开设备并初始化设备。 |
9 |
flush |
清除内容,一般只用于网络文件系统中。 |
10 |
release |
关闭设备并释放资源。 |
11 |
fsync |
实现内存与设备的同步,如将内存数据写入硬盘。 |
12 |
fasync |
实现内存与设备之间的异步通讯。 |
13 |
lock |
文件锁定,用于文件共享时的互斥访问。 |
14 |
readv |
在进行读操作前要验证地址是否可读。 |
15 |
writev |
在进行写操作前要验证地址是否可写。 |
file_operations结构是Linux内核的重要数据结构,也是file{}、inode{}结构的重要成员。结构file{}和inode{}均定义在/include/linux/fs.h 中。
在file结构体中定义成员变量f_op。
struct file_operations *f_op;
在inode结构体中定义成员变量i_fop。
const struct file_operations *i_fop
在编写设备驱动程序时,需要实现其中几个接口函数:read、write、ioctl、open、release,以完成应用系统需要的功能。