简单linux内核模块的开发

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

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

       开发环境: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函数的打印参数是用来定义打印级别的。如果没有定义,默认的是警告的级别。

 

 

 

 

你可能感兴趣的:(linux,代码,内核模块)