许多语言,例如C,C++,JAVA等等都是从hello world开始的,因此我们的驱动程序的开发也要从hello world入手。
首先来看下我们的代码:
/*********************************************************************************
* Copyright: (C) 2016
* All rights reserved.
*
* Filename: hello.c
* Description: This file
*
* Version: 1.0.0(2016年05月01日)
* Author: xiaohexiansheng <wcchz@hotmail.com>
* ChangeLog: 1, Release initial version on "2016年05月01日 19时08分42秒"
*
********************************************************************************/
#include <linux/init.h> //只能用Linux里的头,所有的库函数都不能用,所有的Linux驱动必须包含的
#include <linux/module.h> //所有的内核模块都要包含的 MODULE_LICENSE("Dual BSD/GPL"); //是用来告知内核, 该模块带有一个*的许可证; 没有这样的说明, 在模块加载时内核会抱怨。 static __init int hello_init(void)
{
printk(KERN_ALERT "hello world\n"); //KERN_ALERT是消息的优先级
//u-boot里有在bootargs设置loglevel=7,就是设置的打印级别,打印级别比7小的都可以打印
return ;
} static __exit void hello_exit(void)
{
printk(KERN_ALERT "goodbye!\n");
} module_init(hello_init); //所有的驱动程序都是从module_init开始的
module_exit(hello_exit);
上面的代码所有的程序都是从module_init函数开始的,module_init的使用是强制性的,这个宏会在模块的目标代码中增加一个特殊的段,用于说明内核初始化函数所在的位置。没有这个定义,初始化函数永远不会被调用
看起来so easy,代码写好了要编译了。就像当初改u-boot,内核一样,编译的时候要用到Makefile文件。
[xiaohexiansheng@centos6 hello]$ vim Makefile
obj-m := hello.o //这个就是编译命令,不过这里的hello.o的文件名一定要与要编译的hello.c的文件名一致 modules:
//sudo make -C /lib/modules/内核版本/build/ M=`pwd` modules
sudo make -C /lib/modules/`uname -r`/build/ M=`pwd` modules
make clean //编译出来有很多中间文件,而我们只需要.ko的文件所以要把其他多余的文件删掉
clean:
rm -f *.ko.* *.o *.mod.c *.order *.symvers //清除多余的中间文件
[xiaohexiansheng@centos6 hello]$ make
make之后就可以看到一个hello.ko的文件
[xiaohexiansheng@centos6 hello]$ sudo insmod hello.ko
此时我们就装载好了我们的hello world的驱动,用lsmod命令即可查看:
[xiaohexiansheng@centos6 hello]$ lsmod
Module Size Used by
hello 559 0
fuse 62472 0
ip6table_filter 2245 0
ip6_tables 10301 1 ip6table_filter
......
如果想要移除驱动模块,则用rmmod命令
[xiaohexiansheng@centos6 hello]$ sudo rmmod hello.ko
如果我们想要这个驱动在开发板上运行就要编译适用于开发板的hello.ko文件:
[xiaohexiansheng@centos6 hello]$ vim Makefile
CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc //指定交叉编译器的位置
KDIR?=/home/xiaohexiansheng/fl2440/kernel/mylinux //指定内核的位置
obj-m = hello.o default:
sudo $(MAKE) -C $(KDIR) M=`pwd` modules
make clean clean:
rm -f *.ko.* *.o *.mod.c *.order *.symvers
make之后跟上面的步骤一样,唯一的区别是装载驱动模块和移除驱动模块是不要加.ko的后缀。