进入初学者共同的第一个驱动程序Hello world!
#include <linux/kernel.h> /*用于实现内核中的printk函数,与用户空间用printf不同,内核空间要用printk */ #include <linux/module.h> /* Needed by all modules */ MODULE_LICENSE("Dual BSD/GPL"); /*模块许可证声明,若无,模块被加载时将收到内核被污染的警告*/ static int hello_init(void) /*使用static为程序模块化、通用化提供方便*/ { printk(KERN_ALERT "Hello,linux!\n"); /*KERN_ALERT为输出级别*/ return 0; } static void hello_exit(void) { printk(KERN_ALERT "Goodbye,hello\n"); } module_init(hello_init); /*模块加载函数必须以module_init(函数名)的形式被指定,初始化成功返回0*/ module_exit(hello_exit); /*模块卸载函数必须以module_exit(函数名)的形式被指定,无返回值*/
|
接下来为hello world写了简单的Makefile:
obj-m :=hello.o # obj-m表示该文件要作为模块编译。
|
然后是Kconfig文件
config hello tristate "Mini2440/QQ2440 module sample" /*指定类型tristate,后跟输入提示*/ depends on ARCH_S3C2410 /*依赖关系*/ default m if MACH_FRIENDLY_ARM_MINI2440 help /*帮助信息*/ Mini2440/QQ2440 module sample.
|
生成hello.ko文件
[root@localhost hellomod]# make -C /opt/FriendlyARM/mini2440/linux-2.6.29/ M=$(pwd) modules
|
将hello.ko文件下载到开发板运行
[root@FriendlyARM /]# insmod hello.ko Hello, [root@FriendlyARM /]# rmmod hello.ko [root@FriendlyARM /]# rmmod hello Goodbye,hello rmmod: module 'hello' not found
|
这样一个简单的hello module就这样完成了,在试验过程中还是遇到了不少问题。
(1)在模块编译后下到开发板运行出现过“insmod: cannot insert 'hello.ko': invalid module format”,这是因为编译模块的时候不了解版本依赖的问题,编译的时候我指定的是fedora的内核源代码目录,而没有选择友善提供的linux-2.6.29目录,导致出现问题,在linux设备驱动开发第三版第二章平台依赖性里有说明。
(2)在在卸载模块rmmod hello后,不知道Goodbye,hello后面为什么突然多了一句rmmod: module 'hello' not found,在做下一个驱动试验室希望能够找出这个问题。
疑问:
对Kconfig中的这一句不太理解 default m if MACH_FRIENDLY_ARM_MINI2440
阅读(1191) | 评论(1) | 转发(0) |