通过在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?