首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字符设备驱动挂系统-如何避免?

字符设备驱动挂系统-如何避免?
EN

Stack Overflow用户
提问于 2013-12-31 14:01:12
回答 1查看 1.4K关注 0票数 1

我正在编写一个简单的可写字符设备驱动程序(2.6.32-358.el6.x86_64,在VirtualBox下),而且由于它还不成熟,它倾向于崩溃/冻结(分段故障,无限循环)。

我正在像这样测试它:$> echo "some data" > /dev/my_dev,如果发生崩溃/冻结,整个系统(VirtualBox)就会结冰。我试图将所有工作转移到另一个内核线程,以避免系统范围内的冻结,但这并没有帮助。

是否有可能“隔离”这样的崩溃/冻结,以便我能够杀死进程,在谁的上下文中运行内核模块?

EN

回答 1

Stack Overflow用户

发布于 2013-12-31 14:12:02

该模块在内核上下文中运行。这就是为什么调试是困难的,而bug很容易使系统崩溃。无限循环并不是一个真正的问题,因为它只是减慢了系统的速度,但不会导致崩溃。但是,写入错误的内存区域是致命的。

如果你幸运的话,你会在冻结前得到一个内核oops。如果您在一个TTY而不是GUI中测试您的代码,那么您可以立即在屏幕上看到oops (内核错误日志),您可以学习它和might be helpful to you

然而,在我的经验中,最好在用户空间中编写和测试独立于内核的代码,可能是使用模拟函数并对其进行大量测试,在上面运行valgrind,并确保它没有bug。然后在内核空间中使用它。您可能会惊讶于内核模块的代码实际上可能根本不需要内核上下文。当然,这很大程度上取决于内核模块的功能。

要在内核空间中实际调试代码,有一些我从未使用过的工具,比如kgdb。我自己做的通常是printk和二进制搜索的混合。也就是说,如果崩溃非常严重,以致于根本没有显示内核oops。首先,我在不同的地方放置了printk (可能后面有延迟),以查看在oops之前到达代码的哪些部分。tail -f /var/log/messages会派上用场。然后,我进行二进制搜索;禁用一半的代码以查看是否发生崩溃。如果不是,问题可能在下半场。如果发生这种情况,问题肯定发生在上半年。重复!

编写没有bug的内核模块的最终方法是首先编写没有bug的代码。当然,这是不可能的,但是如果您编写干净和未定义的C代码,并编写非常简洁的函数,其正确性是显而易见的,并且注意数组的边界,这并不难。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20858527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档