最近在看linux的设备驱动程序,写一个简单的helloworld程序都花了我好久的时间,具体过程如下:
编写helloworld.c
编写Makefile
注意,makefile中的命令那里是一个tab,而不是多个空格,还有源文件的名字不要写错了,然后make,出现了下面这些错误make -C /lib/modules/3.8.0-29-generic/build M=/home/Linux/helloworld modules
make[1]: Entering directory `/usr/src/linux-headers-3.8.0-29-generic'
CC [M] /home/Linux/helloworld/helloworld.o
In file included from include/linux/types.h:5:0,
from include/linux/init.h:5,
from /home/Linux/helloworld/helloworld.c:1:
include/uapi/linux/types.h:4:23: fatal error: asm/types.h: No such file or directory
compilation terminated.
make[2]: *** [/home/Linux/helloworld/helloworld.o] Error 1
make[1]: *** [_module_/home/Linux/helloworld] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-3.8.0-29-generic'
make: *** [default] Error 2
在pc机的linux下运行helloworld驱动时不需要重新编译内核的,然后上面却提示缺少文件,后面看看确实是缺少文件,于是,我在windows下装了个虚拟机,用的也是ubuntu12.04,关于安装可以看我上传的资源,将这个helloworld.c和Makefile拷贝虚拟机下的ubuntu下,运行make,出现
ls一下可以看到生成的文件如下:
可以看到什么都没有改,然而这里就make成功了。看来用wubi安装系统有一定的缺陷。
insmod ./helloworld.ko加载驱动,没有打印信息,在/var/log/syslog下可以看到打印信息,注意不是在/var/log/messages下的哦。vim /var/log/syslog后按下G,跳到后面,看下图
这样,ubuntu12.04下pc机的helloworld驱动就正常运行起来了。
注明:上面的东西发表在10月15日,但在10月17日才找出真正的原因,上面的历程就当是一个回忆,下面对上面的错误的理解进行纠正。
首先:上面提到了再pc机的ubuntu(不是虚拟机,即是用wubi安装的ubuntu),编译helloworld驱动不成功,这个确实是不用编译内核的,上面报错的原因是由于他在make的时候是采用了交叉编译环境,而不是gcc。在修改了
注释到下面的3行,make就成功了。而绝不是wubi安装ubuntu系统带来了的问题。注明:修改的文件是/etc/bash.bashrc,然后修改后必须要重启终端。
发现该问题的过程:
10月15号,装了一个虚拟机,成功的运行了helloworld驱动程序后,就有了上面的文档,之后再虚拟机上装了交叉编译工具,在17日编译的时候再度出错,原来成功的东西又出错,就觉得是这里的问题了,过来,安装上面的改法就成功了,不容易啊,菜鸟。