一、结构体
1. cdev 结构体
struct cdev { struct kobject kobj; /* 内嵌的 kobject 对象 */ struct module *owner; /*所属模块*/ struct file_operations *ops; /*文件操作结构体*/ struct list_head list; dev_t dev; /*设备号*/ unsigned int count; 8 };
2. file_operations 结构体
struct file_operations { struct module *owner; /* 拥有该结构的模块的指针,一般为 THIS_MODULES */ loff_t(*llseek)(struct file *, loff_t, int); /* 用来修改文件当前的读写位置 */ ssize_t(*read)(struct file *, char _ _user *, size_t, loff_t*); /* 从设备中同步读取数据 */ ssize_t(*write)(struct file *, const char _ _user *, size_t, loff_t*); /* 向设备发送数据*/ ssize_t(*aio_read)(struct kiocb *, char _ _user *, size_t, loff_t); /* 初始化一个异步的读取操作*/ ssize_t(*aio_write)(struct kiocb *, const char _ _user *, size_t, loff_t); /* 初始化一个异步的写入操作*/ int(*readdir)(struct file *, void *, filldir_t); /* 仅用于读取目录,对于设备文件,该字段为 NULL */ unsigned int(*poll)(struct file *, struct poll_table_struct*); /* 轮询函数,判断目前是否可以进行非阻塞的读取或写入*/ int(*ioctl)(struct inode *, struct file *, unsigned int, unsigned long); /* 执行设备 I/O 控制命令*/ long(*unlocked_ioctl)(struct file *, unsigned int, unsigned long); /* 不使用 BLK 的文件系统,将使用此种函数指针代替 ioctl */ long(*compat_ioctl)(struct file *, unsigned int, unsigned long); /* 在 64 位系统上,32 位的 ioctl 调用,将使用此函数指针代替*/ 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(*aio_fsync)(struct kiocb *, int datasync); /* 异步 fsync */ int(*fasync)(int, struct file *, int); /* 通知设备 FASYNC 标志发生变化*/ int(*lock)(struct file *, int, struct file_lock*); ssize_t(*sendpage)(struct file *, struct page *, int, size_t, loff_t *, int); /* 通常为 NULL */ unsigned long(*get_unmapped_area)(struct file *,unsigned long, unsigned long, unsigned long, unsigned long); /* 在当前进程地址空间找到一个未映射的内存段 */ int(*check_flags)(int); /* 允许模块检查传递给 fcntl(F_SETEL...)调用的标志 */ int(*dir_notify)(struct file *filp, unsigned long arg); /* 对文件系统有效,驱动程序不必实现*/ int(*flock)(struct file *, int, struct file_lock*); ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int); /* 由 VFS 调用,将管道数据粘接到文件 */ ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); /* 由 VFS 调用,将文件数据粘接到管道 */ int (*setlease)(struct file *, long, struct file_lock **); };