《TQ2440加载Hello world驱动模块》
经过将近一个月都时间终于按照手册把Linux内核移植完了,接下来要开始驱动模块的移植了,在网上查了一些资料,总结如下:
目标平台:TQ2440 ARM9
内核版本:Linux-2.6.25
前提:宿主机上已安装交叉编译工具,因为这个在linux内核移植的时候就使用过了,这里就不说了。
进入正题
1、首先进入一个目录,在其中创建一个文件夹
#cd /home/wanyao/module
#vim hello.c
1. #include <linux/init.h> 2. #include <linux/module.h> 3. MODULE_LICENSE("Dual BSD/GPL"); 4. 5. static int hello_init(void) 6. { 7. printk(KERN_ALERT "Hello, world "); 8. return 0; 9. } 10. 11. static void hello_exit(void) 12. { 13. printk(KERN_ALERT "Goodbye, cruel world "); 14. return 0; 15. } 16. 17. module_init(hello_init); 18. module_exit(hello_exit);
2、创建Makefile文件
#vim Makefile
1. KERNELDIR=/opt/EmbedSky/linux-2.6.25 2. PWD:=$(shell pwd) 3. INSTALLDIR=$(PWD) 4. CC=arm-linux-gcc 5. obj-m := hello.o 6. modules: 7. $(MAKE) -C $(KERNELDIR) M=$(PWD) modules 8. clean: 9. rm -rf *.o *.ko *.mod.c *.markers *.order *.symvers 10. .PHONY:modules clean
注意:驱动模块不一定要放在内核树里,只要你的Makefile指定了内核树的路径就没问题,所以我这里在/home/wanyao/里建立了一个module目录专门用来开发驱动模块
3、然后进行make
#make
结果生成好多文件,其中hello.ko就是我们需要的用来加载的模块文件。
4、利用tftp将hello.ko这个模块文件上传到开发板上(这个步骤在我另一篇博客中有详细介绍)
5、加载模块,进行测试(一下操作是在开发板中的系统终端执行的)
# insmod hello.ko
Hello, world # rmmod hello
Goodbye, cruel world
大功告成!
insmod时可能出现的错误:
1、hello: version magic 2.6.30.4 mod_unload ARMv4 should be2.6.30.4-EmbedSky mod_unload ARMv4 insmod: cannot insert hello.ko: invalid module format 出错原因:模块版本与内核版本不匹配! 解决办法:导入预设配置信息,进入menuconfig 继续配置General config ->( )Local version -> 括号中加入如下内容:“-EmbedSky”退出保存为 .config ,重新编译内核、驱动模块,再来加载模块
2、hello: Unknown symbol__aeabi_unwind_cpp_pr0 insmod: cannot insert hello.ko: unknown symbol in module, or unknown parameter 出错原因:模块和内核镜像不匹配
解决方法:尽量用和你同时用来编译驱动而生成的内核镜像zImage,zImage烧到板子上。Ldd3上有句话:尽管并不是必需的,但最好运行和模块对应的内核。
刚开始学驱动,终于成功加载了hello world 模块! 这是学习驱动的一小步,但是对我来说却是一大步!
感谢http://www.cnblogs.com/wanyao/archive/2011/11/21/2257628.html提供的帮助