ioctl(),unlocked_ioctl()和compat_ioctl()有什么区别?


37

通过在Linux 2.6.36源代码去lxr.linux.no,我无法找到ioctl()的方法file_operations。相反,我发现了两个新电话:unlocked_ioctl()compat_ioctl()。是什么区别ioctl()unlocked_ioctl()compat_ioctl()

Answers:


39

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取决于驱动程序,因此无法进行与驱动程序无关的转换。


1
我查看了最新的ioctl来源,发现syscall进行了一些检查,然后跳到这里。您知道我可以在哪里收集有关ioctl系统的更多信息吗?我对字符文件上的ioctl命令如何路由到适当的驱动程序感兴趣。是通过unlocked_ioctl这种情况发生的吗?每个文件都使用一个函数指针的事实(在这种情况下为a struct file),看来我可能已经关闭了。unlocked_ioctl在驱动程序初始化之后是否注册了字符文件mknod
sherrellbc

1
@sherrellbc设备驱动程序unlocked_ioctlstruct file_ops启动时注册文件处理方法,例如in ,并且struct file_ops在打开文件时将其从中填充到文件对象中。mknod对此不起作用。
吉尔(Gilles)'所以

我懂了。我以为设备驱动程序必须首先mknod通过字符设备公开其接口,然后再将关联的文件操作重定向到自身(通过unlocked_ioctl)。
sherrellbc

4

在某些情况下,将内核2.6.36中的(include / linux / fs.h)结构文件操作方法ioctl()替换为compat_ioctl()无效(例如,对于某些设备驱动程序),必须使用unlocked_ioctl()。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.