简单linux内核模块的开发

来源:互联网 发布:论坛源码hybss 编辑:程序博客网 时间:2024/05/03 21:30

       看了一个月的应用开发,今天开始看简单的驱动。开始看的是韦大神的代码,但是期间出现了几个小问题。

所以回头看国嵌的视频,内核模块开发这一部分。内核模块我自己的理解就是驱动程序注册进内核的过程。

       开发环境: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.oelseKDIR := /lib/modules/2.6.18-92.el5/buildall:make -C $(KDIR) M=$(PWD) modulesclean:rm -f *.ko *.o *.mod.o *.mod.c *.symversendif


在Makefile的第二行,是生成的目标文件。但是这一部分还是没有完全搞懂。

Makefile的第四行,是编译内核模块的时候需要用到的内核,这个时候要根据不同的内核版本进行修改。

小问题:

1,内核模块版本不匹配。//一定要找到相对应的内核进行编译。
      不要投机取巧。
2,内核printk函数的打印参数是用来定义打印级别的。如果没有定义,默认的是警告的级别。