通过在Linux 2.6.36源代码去lxr.linux.no,我无法找到ioctl()
的方法file_operations
。相反,我发现了两个新电话:unlocked_ioctl()
和compat_ioctl()
。是什么区别ioctl()
,unlocked_ioctl()
和compat_ioctl()
?
通过在Linux 2.6.36源代码去lxr.linux.no,我无法找到ioctl()
的方法file_operations
。相反,我发现了两个新电话:unlocked_ioctl()
和compat_ioctl()
。是什么区别ioctl()
,unlocked_ioctl()
和compat_ioctl()
?
Answers:
Meta-answer:Linux内核上发生的所有原始事件都通过lkml(Linux内核邮件列表)进行。有关摘要,请阅读或搜索lwn(Linux每周新闻)。
答:从的ioctl()的新方法由乔纳森·科比特:
ioctl()
是在大内核锁(BKL)下运行的内核其余部分之一。过去,BKL的使用使长时间运行的ioctl()
方法可以为不相关的进程创建较长的延迟。
下面介绍了该补丁的说明unlocked_ioctl
,并compat_ioctl
为2.6.11。该字段的删除ioctl
发生在2.6.36之后。
说明:ioctl
执行该命令时需要使用大内核锁(BKL),因此无法同时执行其他任何操作。这在多处理器计算机上非常糟糕,因此需要付出很大的努力才能摆脱BKL。首先unlocked_ioctl
介绍。它使每个驱动程序编写者都可以选择使用什么锁。这可能很困难,所以在过渡期间,旧驱动程序仍然ioctl
可以使用(使用),而新驱动程序可以使用改进的界面(unlocked_ioctl
)。最终,所有驱动程序都已转换,ioctl
可以删除。
compat_ioctl
实际上是无关的,即使它是同时添加的也是如此。其目的是允许32位用户态程序ioctl
在64位内核上进行调用。最后一个参数to的含义ioctl
取决于驱动程序,因此无法进行与驱动程序无关的转换。
unlocked_ioctl
在struct file_ops
启动时注册文件处理方法,例如in ,并且struct file_ops
在打开文件时将其从中填充到文件对象中。mknod
对此不起作用。
mknod
通过字符设备公开其接口,然后再将关联的文件操作重定向到自身(通过unlocked_ioctl
)。
在某些情况下,将内核2.6.36中的(include / linux / fs.h)结构文件操作方法ioctl()替换为compat_ioctl()无效(例如,对于某些设备驱动程序),必须使用unlocked_ioctl()。
unlocked_ioctl
这种情况发生的吗?每个文件都使用一个函数指针的事实(在这种情况下为astruct file
),看来我可能已经关闭了。unlocked_ioctl
在驱动程序初始化之后是否注册了字符文件mknod
?