开发环境 ubuntu 10.04
从新接触Linux驱动开发,可能是做了2年单片机开发的关系,对于以前Linux很多不明白的东西,现在逐渐清晰了。驱动开发也一样,虽然不能一下子掌握内核提供给驱动的一些函数的应用,不过慢慢的会掌握的。
首先说说 hello world 的 感想:
hello word 代码:hello.c
-
#include "linux/init.h"
-
#include "linux/module.h"
-
-
MODULE_LICENSE("Dual BSD/GPL");
-
-
static int hello_init(void)
-
{
-
printk(KERN_ALERT"Hello,world\r\n");
-
return 0;
-
}
-
static void hello_exit(void)
-
{
-
printk(KERN_ALERT"Goodbye,cruel world\r\n");
-
}
-
-
module_init(hello_init);
-
module_exit(hello_exit);
代码很简单,也很容易看懂,不过,还是要敲一下,加深一下记忆吧。这段代码主要的知识点有:
1 包含的头文件不再是应用程序路径的文件了比如/usr/include,而是内核目录下的include /usr/src/kernel/include 下的文件。具体那个函数,宏在哪个头文件里面暂时很不知道,日后慢慢就会熟悉了。
2 hello_init 和 hello_exti 都定义成 static 类型的函数,其实这个不一定要这样定义,不过,为了不让本文件的一些符号影响到系统的其他符号,或者为了不要让以后定义的符号和本文件的符号有冲突,最好就是加上static 。
3 module_init,module_exit,具体的实现我还没有看,这里猜测应该是linux 定义的宏或者函数,用于把钩子函数 hello_init,和 hello_exit 挂接到Linux提供的驱动接口上。当用命令 insmod hello.ko的时候,就会进行挂接,挂接的同时调用hello_init,当调用rmmod hello.ko 时就会删除挂接,同时调用hello_exit函数。
makefile 如下:
-
obj-m := hello.o
-
KERNELDIR := /lib/modules/2.6.32-45-generic/build/
-
PWD := $(shell pwd)
-
-
modules:
-
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
-
modules_install:
-
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
可以理解这段代码,也可以按照这段代码修改成其他文件所用的,当时要我自己写出来就不行了。这是网上copy下来的。
阅读(912) | 评论(0) | 转发(0) |