我目前正在学习如何编写Linux设备驱动程序,而我无法理解“ struct file ”。我正在使用Linux Device Drivers第3版这本书来帮助我。
这就是我的理解。
一个。 struct file 表示一个打开的文件,因此,当在设备驱动程序模块中调用open时,内核将创建一个包含与设备驱动程序相关的所有内容的struct文件。
湾如果你想传递这个设备驱动程序的实例,那么必须在open()之后将指针传递给内核创建的特定结构文件
℃。 file-> private_data 将始终返回指向设备的指针。
与此相关的另一个问题是字段“ f_pos ”。该书说如果想知道文件中的当前位置,驱动程序可以读取该值。这是我从中理解的。
d。如果 struct foo_dev 并且此驱动程序用于存储数据的内存总量为 X ,则f_pos指向该块中的当前位置驱动程序保留的内存。
我理解的是多少是正确的,请在我错的地方纠正我。
谢谢,
米尔
答案 0 :(得分:15)
struct文件由内核创建,代表设备的内核视图,允许内核从文件句柄映射到设备。
struct文件只包含内核上层需要的数据,如果你需要额外的存储来跟踪你的设备状态(通常你会)你需要分配内存,这不太可能是驱动程序所需的全部内容您自己的结构要么是在开放功能中,要么是在检测到硬件时更常见。
如果您确实分配了存储空间,那么您可以使用file-> private_data来允许您通过读/写/等方式从传递给驱动程序的结构文件中获取结构。
如何使用file-> private_data取决于驱动程序,内核不会触及它。它只是供司机使用。
f_pos字段是内核的遗留物,它使用相同的结构文件来存储设备和文件。如果你的设备支持某种形式的随机访问(比如一个ram设备),那么它取决于你的设备是否会发生下一个操作,如果你的设备支持某种形式的随机访问(比如一个ram设备),那么使用f_pos并实现lseek可能是有意义的,如果你的硬件是顺序的,那么f_pos通常是不相关的。
答案 1 :(得分:3)
这是安德鲁所说的......
a)struct FILE由内核提供,但它是作为内核和一个应用程序之间的接口。
b)换句话说,您无法在多个应用程序之间传递FILE结构以共享设备。唯一可以分享的例外是父母与父母之间的分享。子进程。 从多个应用程序,每个应用程序同时访问设备或设备驱动程序。必须在设备和电话上打开电话创建自己的FILE结构。是否允许同时访问取决于驱动程序。内核在这里没有发言权。
c)private_data正是它所说的。设备驱动程序专用的数据。应用程序或库可以使用此字段来传达非常特定于设备驱动程序的数据。