2017-11-11 242 views
-1

我是新的内核模块开发,并决定今天编写我的第一个内核模块。内核模块负载导致错误

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

内核模块通过一个名为calc(/ proc/calc)的proc入口进行通信,因此从文件中读取将返回输出并且写入该文件将给出新输入(2个数字由空白分隔)

当加载模块(insmod)时,我的外壳卡住了,在中断它并查看dmesg时,我看到一个内核BUG行, here is the trace

我不确定这是否是我的代码中的错误,或者它是在Linux内核的实际错误,并希望了解我做错了什么,我该如何开始调试我的模块与给定dmesg日志。

here is the source code of my module

我的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,非常标准。

+0

根据堆栈溢出的规则,你的驱动器和跟踪的代码应该是在问题本身**的**的文字,没有链接。 – Tsyvarev

+0

好的,没有意识到,谢谢。 生病下一次更好 –

回答

0

您是否创建了设备文件?

[email protected]:~/s_flow/dd# ls -l /dev/my_device 

如果没有的话在我的系统中使用以下命令

[email protected]:~/dd/char1# mknod /dev/my_device c 300 0 

首先创建设备文件(Ubuntu的14.04),这一切都很好,如下。

[email protected]:~/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 : 

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

+0

我不太清楚为什么是点头要求,谨慎解释? p.s它没有帮助,但不是我没有得到任何日志在我的dmesg –

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