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

Sen*_*Sen 42 linux drivers

lxr.linux.no浏览 linux 2.6.36 源代码,我ioctl()file_operations. 相反,我发现了两个新调用:unlocked_ioctl()compat_ioctl()。是什么区别ioctl()unlocked_ioctl()compat_ioctl()

Gil*_*il' 44

元答案:发生在 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取决于驱动程序,因此无法进行独立于驱动程序的转换。