由于IOCTL调用,调试内核挂起

时间:2013-02-27 11:49:39

标签: linux module linux-kernel ioctl

我正在尝试使用2.6.32内核的内核模块来处理3.6内核。我们使用IOCTL调用来更新Linux内核模块中的结构。这些调用在2.6.32内核中运行良好。

当我在3.6内核中尝试相同时,每当ioctl调用来自用户空间应用程序时,我都面临内核挂起。它是一个基于套接字的接口而不是基于文件的接口,因此我们使用struct proto_ops下的ioctl。

如何调试此方案,因为没有生成核心转储。要从用户空间复制数据,我使用的是copy_from_user命令。

调试此场景的任何指针都非常有用

1 个答案:

答案 0 :(得分:0)

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

按照解释将unlocked_ioctl和compat_ioctl引入2.6.11的补丁。在2.6.36中,ioctl字段的删除发生了很多次。

说明:执行ioctl时,它占用了Big Kernel Lock (BKL),因此没有其他任何东西可以同时执行。这在多处理器机器上非常糟糕,因此需要付出巨大努力来摆脱BKL。首先,引入了unlocked_ioctl。它允许每个驱动程序编写者选择使用什么锁。这可能很困难,因此有一段时间的过渡期间老驱动程序仍在使用(使用ioctl)但新驱动程序可以使用改进的接口(unlocked_ioctl)。最终所有驱动程序都被转换,ioctl可以删除。

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

参考:new way of ioctl()Jonathan Corbet

相关问题