ioctl()、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()

答案1

元答案:Linux 内核中发生的所有原始内容都会经历lkml(Linux 内核邮件列表)。如需解释性摘要,请阅读或搜索lwn(Linux 每周新闻)

答案:来自ioctl()的新方式经过乔纳森·科贝特:

ioctl()是在大内核锁(BKL)下运行的内核的其余部分之一。过去,BKL 的使用使得长时间运行的ioctl()方法有可能为不相关的进程造成较长的延迟。

unlocked_ioctl以下是对2.6.11 中引入的补丁的说明compat_ioctl。这移除ioctl字段事情发生得很晚,发生在 2.6.36。

说明:ioctl执行时,花费了大内核锁(BKL),所以没有其他东西可以同时执行。这在多处理器机器上是非常糟糕的,因此我们付出了很大的努力来摆脱 BKL。首先,unlocked_ioctl进行了介绍。它允许每个驱动程序编写者选择要使用的锁。这可能很困难,因此有一段过渡期,在此期间旧驱动程序仍然可以工作(使用ioctl),但新驱动程序可以使用改进的界面(unlocked_ioctl)。最终所有驱动程序都被转换并ioctl可以被删除。

compat_ioctl实际上是不相关的,尽管它是同时添加的。其目的是允许 32 位用户态程序ioctl在 64 位内核上进行调用。最后一个参数的含义ioctl取决于驱动程序,因此无法进行与驱动程序无关的转换。

答案2

在某些情况下,在内核 2.6.36 中将 (include/linux/fs.h) struct file_operations 方法 ioctl() 替换为 compat_ioctl() 不起作用(例如,对于某些设备驱动程序),必须使用unlocked_ioctl()。

相关内容