中国卓别林:教你完成最简单的linux驱动 hello world

来源:百度文库 编辑:偶看新闻 时间:2024/05/03 09:52:10
最简单的linux驱动hello world,向你展示了一个linux驱动的框架,代码如下(来自己有linux设备驱动一书,稍做改动):

1 #include
2 #include
3 #include
4
5 MODULE_LICENSE("GPL");
6
7 static int hello_init(){
8     printk(KERN_ALERT"Hello world\n");
9     return 0;
10 }
11
12 static void hello_exit(){
13     printk(KERN_ALERT"Good bye world\n");
14 }
15
16 module_init(hello_init);
17 module_exit(hello_exit);

对于这点代码,相信大家都能看明白,不明白的可以查看一下linux设备驱动一书,我在这里向大家介绍的主要问题不在于这几行代码,而在于怎么样正确的编译这一段代码,相信这也是大家遇到问题最多的地方。

下面是我使用的Makefile文件的内容:
TARGET=hello     //这一行是定义模块名

KDIR=/usr/src/linux/   //指定内核源友树所在的目录
PWD=$(shell pwd)     //得到驱动代码所在的目录并存储在PWD变量 中
obj-m:=$(TARGET).o
default:
make -C $(KDIR) M=$(PWD) modules   //利用内核提供的Makefile和Kconfig系统来编译驱动模块
当你make的时候,可能会出现一个问题,提示有某些头文件找不到,这种情况下是因为内核源码树还没有做好编译驱动模块的准备,这时候可以到内核源码树的目录下执行make modules_prepare命令,这样再make驱动模块的时候就不会再出现这个错误了,如果make modules_prepare命令还有错误的话,就先执行一次make menuconfig命令,生成config文件。

这样就可以正常的编译通过驱动模块了,在当前目录下会得到一个hello.ko的文件,再利用insmod命令和rmmod命令就可以把这个模块加载到系统和从系统移出(需要注意的是这两个命令只能由root用户来执行)。

接下在很多有可能会遇到一个问题,当用insmod命令把hello.ko模块加载到系统的时候会出现
insmod: error inserting 'hello.ko': -1 Invalid module format  错误。这个错误是因为你编译模块的时候采用的源码的版本同你系统现在使用的内核的版本不一致造成的,解决的方法就是使用和系统内核版本一致的内核源码树。