单独编译驱动、加载出现的问题

驱动开始在内核中编译并加载可以通过,考虑到驱动方便修改,所以将驱动单独编译然后在系统启动后手动加载。
单独编译后用insmod加载时出现如下提示:

module license 'unspecified' taints kernel

出现这种现象有两种原因

1. 内核中没有添加license声明;

linux内核的license声明可以遵循这些协议”GPL“,”GPL2“等。
需要在内核中添加如下声明:

MODULE_LICENSE("GPL");

2. 编译方法错误;

单独一个文件a.c时编译成功并可以正确加载,但当有多个文件时如增加了b.c、c.c、d.c后可以正常编译,加载时出现错误提示:

module license 'unspecified' taints kernel

删除模块,然后重新加载不再出现错误提示,但驱动并没有工作:

rmmod a.ko
insmod a.ko

这是由于Makefile文件编写错误导致的,正确的写法如下:

obj-m += abc.o  ##abc为编译目标名字,且不能与.c文件名一致
abc-objs := a.o b.o c.o d.o
KDIR = /home/linux-kernel4.4.94/
PWD = $(shell pwd)
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnu-
CC    = $(CROSS_COMPILE)gcc
all:
    make -C $(KDIR) M=$(PWD) modules ARCH=mips
clean:
    rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c *.tmp_versions *.symvers *.order
.PHONY: modules clean

修改Makefile文件后,重新编译驱动,可以成功加载驱动程序。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐