C &引用;分段故障“;当`rmmod`或`modprobe-r`

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");

在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");
    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 */