我对基于 ULK 的设备文件和驱动程序有疑问,因此内核为 2.6.11。我的理解如下:
当用户在某些设备文件上执行系统调用 open() 时,内核有时会向设备文件的 inode 请求读/写函数。
设备文件是由 udev 基于 /sys 文件夹中的设备创建的,这意味着设备文件的 inode 应该有 i_fop 字段指向知道如何与设备通信的函数,例如 read() 和 write()。这意味着每个设备文件的 inode->i_fop 字段应该指向不同的 file_operations 结构。
如果是这样,设备驱动程序将提供这些读/写函数,可能是完整的 file_operations 结构,包括读/写/ioctl 等。
现在,ULK 说(在设备文件的 open() 系统调用描述中)“根据设备文件的类型,将 inode 对象的 i_fop 字段设置为 def_blk_fops 或 def_chr_fops 文件操作表的地址。” 这意味着所有块设备文件都具有相同的读/写功能,那么用户如何与不同的设备通信?
我还检查了 device_driver 结构,确实没有文件操作函数的位置,那么 open 系统调用到底如何使用设备特定驱动程序执行其工作呢?如果设备特定操作函数不在 device_driver 中,那么设备特定操作函数在哪里?