驱动struct file结构主要成员和作用
c吧
全部回复
仅看楼主
level 6
一、struct file结构简介
在<linux/fs.h>中定义的struct file是设备驱动程序所使用的一个最重要的数据结构。Struct file是一个内核结构,它不会出现在用户程序中。
fi1e结构代表一个打开的文件(它并不仅仅限定于设备驱动程序,系统中每个打开的文件在内核空间都有一个对应的fi1e结构)。它由内核在open时创建,并传递给在该文件上进行操作的所有函数,直到最后的close函数。在文件的所有实例都被关闭之后内核会释放这个数据结构。
二、struct file结构的主要成员和作用
1、loff_t f pos;
当前的读/写位置。loff_t是一个64位的数,如果驱动程序需要知道文件中的当前位置,可以读取这个值,但不要去修改它。read/write会使用它们接收到的最后那个指针参数来更新这一位置,而不是直接对filp->f_pos进行操作。这一规则的一个例外是llseek方法,该方法的目的本身就是为了修改文件位置。
在读写函数中通过file->f_pos获取这个值,如果需要修改则用使用ppos。
在lseek函数中读取和修改都是通过file->f_pos实现。
2、void *private data;
open系统调用在调用驱动程序的open方法前将这个指针置为NULL。驱动程序可以将这个字段用于任何目的或者忽略这个字段。驱动程序可以用这个字段指向已分配的数据,但是一定要在内核销毁file结构前在release方法中释放内存。private_data是跨系统调用时保存状态信息的非常有用的资源,我们的大部分驱动都使用了它。
这是设备驱动程序是一个常用的成员,目的是在驱动的各个成员之间传递数据。
核心作用
(1)数据传递:在 open 函数中初始化后,private_data 可用于传递自定义设备结构体的地址,后续的 read、write 等操作可通过该指针访问设备特定数据。
(2)设备状态管理:驱动程序通过 private_data 存储和访问设备状态信息(如硬件参数、配置数据等),实现设备级操作。
例如一个按键驱动程序中年使用private_data示例
3、unsigned int f_flags;
文件标志,如O_RDONLY、O_NONBLOCK和O_SYNC。为了检查用户请求的是否是非阻塞式的操作,驱动程序需要检查O_NONBLOCK标志,而其他标志很少用到。注意,检查读写权限应该查看f_mode而不是f_flags。所有这些标志都定义在<linux/fcntl.h>中。
编写驱动程序时,如果内核函数发现不能立即满足用户请求,则默认在内核中阻塞当前进程,如果用户在操作设备文件时传递了O_NONBLOCK标志,则表示是非阻塞,不管是否满足都立即返回。驱动开发者通过f_flags成员确定用户是否传递了O_NONBLOCK。
2025年09月21日 05点09分 1
1