我正在学习如何编写
Linux设备驱动程序,并且我无法理解“struct file”.我正在使用Linux设备驱动程序第3版来帮助我.
这是我的理解
一个.结构文件表示一个打开的文件,因此当在设备驱动程序模块中调用open时,内核将创建一个包含与设备驱动程序相关的一切的结构文件.
湾如果要传递设备驱动程序的这个实例,那么必须将一个指针传递给open()后由内核创建的特定结构文件,
C. file-> private_data将始终返回指向设备的指针.
与此相关的另一个问题是“f_pos”字段.该书说,如果想知道文件中的当前位置,驱动程序可以读取此值.这是我从中了解的.
天.如果struct foo_dev,并且如果此驱动程序用于存储数据的内存总量为X,则f_pos指向由驱动程序保留的内存块中的当前位置.
我理解的是多少是正确的,请纠正我错在哪里.
谢谢,
米尔
解决方法
该结构文件由内核创建并表示内核对您的设备的视图.它允许内核将文件句柄映射到设备.
结构文件只包含内核上层需要的数据,这不太可能是驱动程序需要的一切,如果需要额外的存储来跟踪设备的状态(通常你会),那么你需要为结构在打开的功能或更正常当您检测到您的硬件.
如果您分配存储空间,那么您可以使用文件> private_data来获取通过读/写/ etc传递给您的驱动程序的结构文件到您的结构.
如何使用file-> private_data取决于驱动程序,内核不会触摸它.它刚刚在那里为司机使用.
并保存指向由设备执行各种操作的驱动程序定义的函数的指针.结构的每个字段对应于由驱动程序定义以处理请求的操作的某些功能的地址
f_pos字段是内核使用与设备和文件相同的结构文件的遗产.它具有指向由设备执行各种操作的驱动程序定义的函数的指针.结构的每个字段对应于由驱动程序定义以处理请求的操作的某些功能的地址.这些操作取决于您的设备,如果您的设备支持某种形式的随机访问(例如ram设备),则使用f_pos并实现lseek可能会有意义,如果硬件是顺序的,则f_pos通常是无关紧要的.