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