看了一个月的应用开发,今天开始看简单的驱动。开始看的是韦大神的代码,但是期间出现了几个小问题。
所以回头看国嵌的视频,内核模块开发这一部分。内核模块我自己的理解就是驱动程序注册进内核的过程。
开发环境: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函数的打印参数是用来定义打印级别的。如果没有定义,默认的是警告的级别。