(一)

今天写了个块设备驱动例子,在虚拟机上加载模块insmod simp_blkdev.ko的时候,出现以下错误。

insmod: error inserting 'simple-blk.ko': -1 Invalid module format

 

其实错误很简单,Makefile的编写失误,因为之前是想让这个驱动模块在TQ2440上运行的,所以,Makefile的编写使用了以下形式:

ifneq ($(KERNELRELEASE),)

obj-m := simp_blkdev.o

else

KDIR := /usr/src/linux-2.6.30.4

all:

        make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-

clean:

        rm -f *.ko *.o *.mod.o *.mod.c *.symvers

endif

      主要错误在于红色部分,这个内核模块版本与虚拟机的内核模块版本不一致,导致出现以上错误。

用uname -r 命令查看当前系统的版本是多少,我的查询结果是2.6.18-164.el5

故将其改为:KDIR := /lib/modules/2.6.18-164.el5/build

并且将  ARCH=arm CROSS_COMPILE=arm-linux-  去掉,因为我们要在虚拟机上加载模块,故不使用交叉编译工具。改完之后,再make,编译成功,问题解决。

————————————————————————————————

 (二)

      按照最开始那个Makefile编译出来的.ko文件,通过nfs下载到开发板上,在开发板上加载insmod simp-blkdev.ko 的时候却出现这个错误。

vmap allocation for size 16785408 failed: use vmalloc=<size> to increase size.

insmod: can't insert 'simp-blkdev.ko': Cannot allocate memory

     出错原因也很简单,它的意思是不能分配16785408这么大的空间,所以失败,回到simp_blkdev.c上,原来我们在这里分配的内存空间是16M,当然就出错啦,要知道嵌入式里面的内存是相当宝贵的,不是每一次分配那 么大的空间内核都会响应给你,所以我把simp_blkdev.c上的分配空间改为16k,再重新编译,错误得到解决。

 

PS:学驱动也有一些日子了,但是由于临近期末考试,没有更多的时间来写文章,待考完试我再一一详细介绍驱动相关的知识。最后,正如之前你看到的,LWJ祝大家学习愉快。^_^


作者:柒月