设备驱动程序节点特定的私有数据
Device driver Node specific private data
我想为每个节点 (/dev/foo[1-99]
) 存储特定数据,因为我想将这些节点中的每一个映射到特定硬件。
我开始使用 file->private_data
,但每次调用 open 都会将其设置为 NULL
。
在 open()
调用之间是否有类似的东西可以持久存在?
你问题的答案是"No"(差不多),但你误解了file->private_data
的用法。您可以在 open
文件操作处理程序中设置它,以便您的其他文件操作处理程序函数稍后可以使用它。您的 open
文件操作处理程序可以使用 inode->i_rdev
中的设备编号来决定您的哪个硬件设备正在打开,并设置 file->private_data
以指向该设备的私有数据结构。
请注意,inode->i_rdev
是 "major" 和 "minor" 设备编号的组合。您可以使用 MAJOR(inode->i_rdev)
或 imajor(inode)
提取主要部分,使用 MINOR(inode->i_rdev)
或 iminor(inode)
提取次要部分。此 major/minor 拆分可能对您有用,也可能没有用,具体取决于您注册设备的方式。在任何情况下,您的驱动程序都会注册一个范围的设备号,并且 inode->i_rdev
值将在该范围内。
我第一段中的“(某种)”是因为您的驱动程序看到的 inode->i_rdev
值的范围 是 持续存在,直到它注销它们(然后它将不再看到它们!)。
我想为每个节点 (/dev/foo[1-99]
) 存储特定数据,因为我想将这些节点中的每一个映射到特定硬件。
我开始使用 file->private_data
,但每次调用 open 都会将其设置为 NULL
。
在 open()
调用之间是否有类似的东西可以持久存在?
你问题的答案是"No"(差不多),但你误解了file->private_data
的用法。您可以在 open
文件操作处理程序中设置它,以便您的其他文件操作处理程序函数稍后可以使用它。您的 open
文件操作处理程序可以使用 inode->i_rdev
中的设备编号来决定您的哪个硬件设备正在打开,并设置 file->private_data
以指向该设备的私有数据结构。
请注意,inode->i_rdev
是 "major" 和 "minor" 设备编号的组合。您可以使用 MAJOR(inode->i_rdev)
或 imajor(inode)
提取主要部分,使用 MINOR(inode->i_rdev)
或 iminor(inode)
提取次要部分。此 major/minor 拆分可能对您有用,也可能没有用,具体取决于您注册设备的方式。在任何情况下,您的驱动程序都会注册一个范围的设备号,并且 inode->i_rdev
值将在该范围内。
我第一段中的“(某种)”是因为您的驱动程序看到的 inode->i_rdev
值的范围 是 持续存在,直到它注销它们(然后它将不再看到它们!)。