c-内核模块加载导致错误



我是内核模块开发的新手,今天决定编写我的第一个内核模块。

我的模块应该接收两个数字作为输入,用空格分隔,并将这些数字相加。

内核模块通过一个名为calc(/proc/calc)的proc条目进行通信,因此从该文件中读取将返回输出,而写入该文件将提供新的输入(用空格分隔的两个数字)

当加载模块(insmod)时,我的shell被卡住了,当中断它并查看dmesg时,我看到了内核BUG行,这是痕迹。

我不确定这是我代码中的错误,还是linux内核中的实际错误,我很想了解我做错了什么,以及如何使用给定的dmesg日志开始调试我的模块。

这是我的模块的源代码。

我的makefile是非常标准的,

obj-m += calc.o
KDIR := /lib/modules/$(shell uname -r)/build
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KDIR) M=$(PWD) clean

非常感谢!

编辑:我使用的是ubuntu 16.04.02,版本4.10.0-28,相当标准。

您创建了设备文件吗?

root@xyz-PC:~/s_flow/dd# ls -l /dev/my_device

如果没有,则首先使用以下命令创建设备文件

root@achal:~/dd/char1# mknod /dev/my_device c  300  0

在我的系统(ubuntu 14.04)中,一切都很好,如下所示。

root@xyz:~/s_flow/dd# dmesg
[  519.751941] calc: module verification failed: signature and/or required key missing - tainting kernel
[  519.752368] Calculator initializing
[  519.752372] Initializing proc entry at /proc/calc
[  519.752380] initialized calc proc entry
[  519.752384] mallocing last_message for 128 bytes
[  519.752386] malloc finished, resetting calc
[  519.752389] calc reset, all good :

你能提供使用这个模块的应用程序的详细信息吗?

问题在于语句last_message=";是错误的。。您正在为指针last_message分配无效的内存地址。这就是OOPS即将到来的原因。last_message应该像这样更改

static void reset_calc(void) {
last_message_size = 0;
last_message = "";
last_message_type = WAS_LAST_READ; // we expect the first action to     be write
}

应该改为

memset(last_message,0,MAX_MESSAGE_SIZE);

相关内容

  • 没有找到相关文章

最新更新