gpt4 book ai didi

linux - 调试内核因 IOCTL 调用而挂起

转载 作者:太空狗 更新时间:2023-10-29 12:34:40 29 4
gpt4 key购买 nike

我正在尝试制作一个在 2.6.32 内核上工作的内核模块以在 3.6 内核上工作。我们使用 IOCTL 调用来更新 Linux 内核模块中的结构。这些调用在 2.6.32 内核中运行良好。

当我在 3.6 内核中尝试相同的操作时,每当从用户空间应用程序进行 ioctl 调用时,我都会面临内核挂起。它是基于套接字的接口(interface),而不是基于文件的接口(interface),因此我们在 struct proto_ops 下使用 ioctl。

由于没有生成核心转储,我该如何调试这种情况。要从用户空间复制数据,我正在使用 copy_from_user 命令。

调试此场景的任何指针都会非常有帮助

最佳答案

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

以下是对将 unlocked_ioctl 和 compat_ioctl 引入 2.6.11 的补丁的解释。 ioctl 字段的删除发生在很晚的时候,在 2.6.36 中。

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

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

引用:new way of ioctl()通过 Jonathan Corbet

关于linux - 调试内核因 IOCTL 调用而挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15111382/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com