我是内核模块开发的新手,现在决定编写我的第一个内核模块。
我的模块应该接收2个数字作为输入,用空格分隔并将这些数字加在一起。
内核模块通过名为calc(/ proc / calc)的proc条目进行通信,因此从文件读取将返回输出并写入该文件将提供新输入(由空格分隔的2个数字)
加载模块时(insmod)我的shell卡住,当打断它并查看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 :(得分: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 :
您能提供使用此模块的应用程序详细信息吗?
答案 1 :(得分: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);