C &引用;分段故障“;当`rmmod`或`modprobe-r`
在BusyBox v1.23.0的Beagle Bone Bone board定制内核v4.1.0-rc6上尝试最简单的内核模块,无需任何修改。模块的代码如下所示:C &引用;分段故障“;当`rmmod`或`modprobe-r`,c,linux,kernel,embedded,kernel-module,C,Linux,Kernel,Embedded,Kernel Module,在BusyBox v1.23.0的Beagle Bone Bone board定制内核v4.1.0-rc6上尝试最简单的内核模块,无需任何修改。模块的代码如下所示: #include <linux/init.h> #include <linux/module.h> MODULE_LICENSE("Dual BSD/GPL"); static int hello_init(void) { printk(KERN_ALERT "Hello, world\n");
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "Hello, world\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
模块正在rootfs上编译和安装。此外,它正在加载:
$ insmod hello.ko
[ 30.692404] Hello, world
但当我试图移除它时,我得到了:
$ rmmod hello.ko
Segmentation fault
$modprobe -r hello.ko
Segmentation fault
$ lsmod
hello 813 0 - Live 0xbf000000 (O)
内核在编译时启用了模块卸载(常规和强制)支持
这个问题的可能原因是什么?如何对其进行调查
更新:
正如我在评论中所建议的那样,我尝试了包括linux/kernel.h
、定义模块
、linux
和\uuuuuu内核
符号。在函数中添加了\uuu init
和\uu exit
前缀。删除了静态
修改器。删除了printk
行。结果是一样的dmesg
仅显示最初的问候语。令人惊讶的是,加载和卸载内核模块,如gpio_密钥
或crypto/ccm
正在工作。因此,唯一值得怀疑的是模块的编译方式
更新2将内核更新为最新的快照没有帮助。使用不同的优化设置编译模块没有帮助。下一步,我想,我将修改BusyBox的rmmod,以显示问题的位置。看看这些教程: 尝试添加:
#define MODULE
#define LINUX
#define __KERNEL__
#include <linux/kernel.h> /* Needed for KERN_ALERT */
#定义模块
#定义LINUX
#定义内核__
#包含内核警报所需的/*项*/
我已经设法解决了这个问题。使用strace
我发现当读取BusyBox
特定模块.dep.bb
文件时,SEGFULT发生在某个地方。当使用“简化的modutils”选项(CONFIG\u MODPROBE\u SMALL
)编译时,BusyBox
使用此文件。通过禁用该选项,选择要安装的UTIL并重建BusyBox,我已经完成了模块卸载工作。我相信问题的根源在于测试模块被编译并存储在/lib/…/modules
目录之外,因此busybox
和简化的modutils
只是变得混淆了 代码看起来不错。删除/var/log/messages(或dmesg)时,是否在其中看到更多信息?这只发生在你的模块上,你能成功加载/卸载任何系统模块吗?@BlueMoon不幸的是,我的rootfs:)上甚至没有/var
目录。我正在从头开始构建它,我不确定应该安装哪个附加服务来编写消息。。也许我应该这样做。您是否可以成功加载/卸载其他文件,例如modprobe-nfs
和modprobe-rfs
dmesg
有什么有用的吗?@Blue Moon我今天晚些时候会看看这些,现在必须上班了。我知道模块正在加载。不确定卸货。dmesg
是否仅在带busybox的裸体系统上可用?不管怎样,谢谢你的指导。只要在命令行上运行dmesg
就可以找到答案。
#define MODULE
#define LINUX
#define __KERNEL__
#include <linux/kernel.h> /* Needed for KERN_ALERT */