看了一个月的应用开发,今天开始看简单的驱动。开始看的是韦大神的代码,但是期间出现了几个小问题。
所以回头看国嵌的视频,内核模块开发这一部分。内核模块我自己的理解就是驱动程序注册进内核的过程。
开发环境:Redhat 企业版5。
这次做的实验是编写两个相互关联的模块,分别是hello.c和calculate.c。
hello.c的代码
#include <linux/init.h> #include <linux/module.h> //在hello.c中调用函数实现的具体函数部分。 int add_integar(int a,int b) { return a+b; } int sub_integar(int a,int b) { return a-b; } static int __init sym_init() { return 0; } static void __exit sym_exit() { } //将两个在本程序中的函数导出,这样就可以在hello.c中引用了。 //符号导出的宏,这是两个固定的宏。 EXPORT_SYMBOL(add_integar); EXPORT_SYMBOL(sub_integar); module_init(sym_init); module_exit(sym_exit);
下面是calculate.c的代码
#include <linux/init.h> #include <linux/module.h> //在hello.c中调用函数实现的具体函数部分。 int add_integar(int a,int b) { return a+b; } int sub_integar(int a,int b) { return a-b; } static int __init sym_init() { return 0; } static void __exit sym_exit() { } //将两个在本程序中的函数导出,这样就可以在hello.c中引用了。 //符号导出的宏,这是两个固定的宏。 EXPORT_SYMBOL(add_integar); EXPORT_SYMBOL(sub_integar); module_init(sym_init); module_exit(sym_exit);
这两部分代码都可以执行通,但是需要注意的是前者调用后者,所以在insmod的过程中要先insmod前者。
以下是Makefile部分代码。
ifneq ($(KERNELRELEASE),) obj-m := hello.o calculate.o else KDIR := /lib/modules/2.6.18-92.el5/build all: make -C $(KDIR) M=$(PWD) modules clean: rm -f *.ko *.o *.mod.o *.mod.c *.symvers endif
在Makefile的第二行,是生成的目标文件。但是这一部分还是没有完全搞懂。
在Makefile的第四行,是编译内核模块的时候需要用到的内核,这个时候要根据不同的内核版本进行修改。
小问题:
1,内核模块版本不匹配。//一定要找到相对应的内核进行编译。
不要投机取巧。
2,内核printk函数的打印参数是用来定义打印级别的。如果没有定义,默认的是警告的级别。