开发环境:Fedora 8内核版本:2.6.23.1-42.fc8编译器:GCC (先在主机下做一些驱动的开发和验证,一方面,条件宽裕,另一方面,以后转入开发板,修改下编译器,再修改些设置,即可)第一个驱动例程:
#filename:hello.c#include #include MODULE_LICENCE("Dual BSD/GPL")static int hello_init(void){ printk("Hello world!\n"); return 0;}static void hello_exit(void){ printk("Bye\n");}module_init(hello_init); //宏。当驱动以模块方式加载时,加载的时候会去调用这个宏module_exit(hello_exit); //宏。当驱动以模块方式加载时,卸载的时候会去调用这个宏
Makefile如下:
KERNELDIR = /usr/src/kernel/2.6.23.1-42.fc8-i686 //设置内核头文件所在的位置。PWD:=$(shell pwd) //源文件的所在路径CC = gcc //编译器obj-m:=hello.o modules: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules //-C $(KERNELDIR):指定内核源码的位置 //M=$(PWD):指定模块源码的位置 //modules:指向obj-m变量中设定的模块。clean: rm -rf *.o *.mod.c.PHONY: //.PHONY:伪目标。 modules clean
.PHONY:伪目标。是指,clean并不是一个生成的目标文件的名字,只是一个需要执行的命令。不是一个目标。详见:http://blog.chinaunix.net/u/13991/showart_113965.html#make#insmod hello.ko#dmesg就可以看到打印的信息。因为内核中打印的信息并不一定输出到终端,会保存在一个特定的位置。
如何给内核模块传递参数?
如果希望给一个内核模块传递参数,则可以通过module_param()。
module_param使用了3个参数: 变量名,它的类型,以及一个权限掩码。这个宏定义应当放在任何函数之外,典型的是出现在源文件的前面,定义如:
static int swap_xy = 0;
static int rotate = 0;
module_param(swap_xy, int, S_IRUGO);
module_param(rotate, int, S_IRUGO);
模块参数支持许多类型:
bool
invbool 一个布尔型(true或者false)值。
charp 一个字符指针值。内存为用户提供的字串分配,指针因此设置。
int
long
short
uint
ulong
ushort 基本的变长整型值。以 u 开头的是无符号值。
最后的 module_param 字段是一个权限值,应当使用中定义的值。这个值控制谁可以存取这些模块参数在sysfs中的表示。如果perm 被设为0,就没有sysfs项。否则,出现在/sys/module下面,并带有给定的权限。使用S_IRUGO作为参数可以被所有人读取,但是不能改变。S_IRUGO|S_IWUSR允许root来改变参数。注意,如果一个参数被sysfs修改,你的模块看到的参数值也改变了,但是你的模块没有任何 其他的通知。因此你应当不要使模块参数可写。
例程:
阅读(1192) | 评论(0) | 转发(0) |