通过lxr.linux.no的Linux2.6.36源代码,我无法在file_operations中找到ioctl()方法。相反,我发现了两个新的调用:unlocked_ioctl()和compat_ioctl()。ioctl()、unlocked_ioctl()和compat_ioctl()有什么区别?
发布于 2010-12-10 19:47:21
元答案:所有发生在Linux内核上的原始内容都是通过lkml ( Linux内核邮件列表)实现的。要获得说明性摘要,请阅读或搜索lwn (Linux周刊新闻)。
答:来自ioctl()的新方法 by 乔纳森·科贝特:
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位用户程序在64位内核上进行ioctl调用。ioctl的最后一个参数的含义取决于驱动程序,因此无法进行独立于驱动程序的转换。
发布于 2011-01-12 16:09:54
在内核2.6.36中,将(include/linux/fs.h) struct file_operations方法ioctl()替换为compat_ioctl()是不起作用的(例如,对于某些设备驱动程序),必须使用unlocked_ioctl()。
https://unix.stackexchange.com/questions/4711
复制相似问题