-1

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

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

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

加载模块(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,非常标准。

4

2 回答 2

0

您是否创建了设备文件?

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 :

您能提供使用此模块的应用程序详细信息吗?

于 2017-11-11T02:47:35.603 回答
0

问题是语句 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);
于 2017-11-12T03:25:01.003 回答