【发布时间】:2020-01-06 10:32:24
【问题描述】:
我有一个关于Linux设备文件和驱动的问题,我目前的理解如下:
-
当用户在某个设备文件上调用
李>open()时,内核会在某个时间点向设备文件的inode询问read()/write()函数。 设备文件是由
udev早先创建的,基于/sys文件夹中的设备,这意味着设备文件的inode应该有i_fop字段指向知道如何与之对话的函数设备,例如read/write/mmap/ioctl/poll。这意味着每个设备文件的inode->i_fop字段应该指向不同的file_operations结构。
如果是这样,设备驱动程序将提供这些read()/write()函数,可能是完整的file_operations结构,包括read/write/mmap/ioctl等。
现在,ULK 说(在设备文件的open() 系统调用的描述中)“将inode 对象的i_fop 字段设置为def_blk_fops 或def_chr_fops 文件操作表的地址,根据设备文件的类型。"这意味着所有块设备文件都具有相同的read()/write() 函数,但是用户如何与不同的设备通信呢?
我还检查了device_driver 结构,确实没有地方存储文件访问函数,那么open() 系统调用究竟是如何使用特定于设备的驱动程序执行其工作的呢?如果不在device_driver 中,设备特定的操作功能在哪里?
【问题讨论】:
-
"Linux 如何将设备文件与设备驱动程序链接?" - 按主要和次要 数字。实际上,任何设备文件都只包含这些数字。只有在打开设备文件时,Linux内核才会检查是否注册了具有该编号的设备,并为该设备调用相应的函数。
-
@Tsyvarev 谢谢,那么
device_driver在这个过程中提供了什么,因为cdev结构已经有file_operations? -
如果你查看
device_driverstructure's definition 你会发现这个结构描述的东西与文件操作完全不同。它有例如probe将设备与驱动程序绑定的函数。
标签: c linux linux-kernel linux-device-driver device-driver