file数据结构,file结构体的成员含义
linux/fs.h中定义的Struct文件是设备驱动程序中第二重要的数据结构。注意FILE与用户空间程序的文件指针无关。文件是在C库中定义的,不会出现在内核代码中。另一方面,结构文件是一个内核结构,从不出现在用户程序中。
文件结构代表一个打开的文件。(它不特定于设备驱动程序;系统中每个打开的文件在内核空间中都有一个关联的结构文件)。它是由内核在打开时创建的,并传递给对文件进行操作的任何函数,直到它最终被关闭。文件的所有实例关闭后,内核释放这个数据结构。
在内核源代码中,struct文件的指针通常被称为file或filp(“文件指针”)。我们将始终把这个指针称为filp,以避免与结构本身混淆。所以file指的是结构,filp是结构指针。
这里显示了StrutFile最重要的成员。
1.mode _ t f _ mode
文件模式通过位FMODE_READ和FMODE_WRITE确定文件是可读的还是可写的(或两者都是)。您可能希望在您的open或ioctl函数中检查这个成员的读写权限,但是您不需要检查读写权限,因为内核在调用您的方法之前会进行检查。当文件没有为这种访问而打开时,读或写的尝试会被拒绝,而驱动程序甚至不知道这一点。
2.loff _ t f _ pos
当前读写位置。loff_t在所有平台上都是64位的(gcc术语中的long long)。如果需要知道文件中的当前位置,驱动程序可以读取这个值,但通常不应该改变它;并且读和写应该使用它们接收的指针作为最后的参数来更新一个位置,而不是直接作用于filp- f_pos。此规则的一个例外是llseek方法,其目的是更改文件位置。
3 .无符号整数f _ flags
这些是文件标志,如O_RDONLY、O_NONBLOCK和O_SYNC。驱动程序应该检查O_NONBLOCK标志,看它是否是对非阻塞操作的请求。其他标志很少使用。特别是,您应该检查读/写权限,并使用f_mode而不是f_flags。所有标志都在linux/fcntl.h头文件中定义.
4.struct file _ operations * f _ op
与文件相关的操作。内核将指针作为其开放实现的一部分进行排列,然后读取它们。当它需要调度任何操作时,filp- f_op中的值永远不会被内核保存下来作为以后的引用;这意味着您可以更改与您的文件相关联的文件操作,并且新方法将在您返回到调用者后生效。例如,与主要编号1相关联的开放代码(/dev/null、/dev/zero等)。)根据打开的副号替换filp- f_op中的操作。这种做法允许在同一个主要编号下实现多个行为,而不会在每个系统调用中引入开销。替换文件操作的能力是
编程对象的“方法重载”的内核等价物。
5.void * private _ data
开放系统调用将这个指针设置为空。在为驱动程序调用open方法之前,您可以自由地使用该成员或忽略它。您可以使用这个成员来指向分配的数据,但是您必须记住在内核破坏文件结构之前在release方法中释放内存。private_data是保存系统调用之间状态信息的有用资源,我们的大多数示例模块都使用它。
6.struct dentry * f _ dentry
与文件相关的目录条目(dentry)结构。设备驱动编写者一般不需要关心dentry结构,除了访问inode结构为filp- f_dentry- d_inode。
真实结构还有几个成员,但是它们对设备驱动程序没有用。我们可以安全地忽略这些成员,因为驱动程序从不创建文件结构;他们实际上访问在其他地方创建的结构。