gpt4 book ai didi

c - "Segmentation fault"当 `rmmod` 或 `modprobe -r`

转载 作者:IT王子 更新时间:2023-10-29 00:43:29 25 4
gpt4 key购买 nike

尝试来自 LDD3 的最简单的内核模块无需对带有 BusyBox v1.23.0 的 Beagle Bone 板的自定义构建内核 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);

Makefile 是:

ARCH := arm
CROSS_COMPILE := arm-cortex_a8-linux-gnueabi-
obj-m := hello.o
all:
make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C /path/to/linux/source/tree M=$(PWD) modules
clean:
make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C /path/to/linux/source/tree M=$(PWD) clean

该模块正在 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,定义 MODULELINUX__KERNEL__ 符号。为函数添加了 __init__exit 前缀。删除了 static 修饰符。删除了 printk 行。结果一样。 dmesg 仅显示初始问候语。加载和卸载内核模块,如 gpio_keyscrypto/ccm 正在 工作,令人惊讶。所以唯一值得怀疑的是模块的编译方式。

更新 2
将内核更新到最新的快照没有帮助。使用不同的优化设置编译模块没有帮助。下一步,我想,我将修改 BusyBox 的 rmmod 以指示问题位置..

最佳答案

看看这些教程:

http://www.tldp.org/HOWTO/Module-HOWTO/x839.html http://www.tldp.org/LDP/lkmpg/2.4/html/x281.htm

尝试添加:

#define MODULE
#define LINUX
#define __KERNEL__

#include <linux/kernel.h> /* Needed for KERN_ALERT */

关于c - "Segmentation fault"当 `rmmod` 或 `modprobe -r`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30781040/

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