linux内核代码的编写初步以及makefile的配置

时间:2021-10-29 16:37:29

在linux内核代码开发中,头文件不能包含标准C头文件,只能采用GNC标准

而且内核开发中没有main函数,只有init 和 exit ,这是每个内核模块中必须要包含的函数模块.

在GNU C标准中,打印信息采用printk函数,printk函数有8种级别.

内核模块的编译采用Makefile来编译,利用内核的module中的makefile来编译

#include <linux/init.h>

#include <module.h>

//GPL是一种开源协议,这个必须要添加

MODULE_LICENSE(“GPL”);

MODULE_AUTHOR(“XXX”);  //开发模块的作者信息  可选

MODULE_VERSION(“xxx”);  //模块的版本信息    可选

这里的 S_IRUGO=(S_IRUSR|S_IRGRP|S_IROTH)

S_IRUSR:用户读  00400

module_param_named(name, variable, type, perm);其中name是外部可见的参数名,variable是源文件内部的全局变量名,而module_param通过module_param_named实现,只不过name与variable相同。

Module_param(name ,int ,S_IRUGO);

int hello_init()

{

printk("hello kernel");

}

Int hello_exit()

{

printk("goodbye kernel");

}

//以下两个模块必须要添加

Module_init(hello_init);

Module_exit(hello_exit);

内核模块Makefile的编写

KERNELRELEASE是在内核源码的顶层Makefile中定义的一个变量,在第一次读取执行此Makefile时,KERNELRELEASE没有被定义,所以make将读取执行else之后的内容,如果make的目标是clean,直接执行clean操作,然后结束。当make的目标为all时,-C
$(KDIR)指明跳转到内核源码目录下读取那里的Makefile;M=$(PWD)表明然后返回到当前目录继续读入、执行当前的Makefile。当从内核源码目录返回时,KERNELRELEASE已被定义,kbuild也被启动去解析kbuild语法的语句,make将继续读取else之前的内容。else之前的内容为kbuild语法的语句,指明模块源码中各文件的依赖关系,以及要生成的目标模块名。param-objs

:= file1.ofile2.o表示param.o由file1.o与file2.o连接生成,obj-m
:= param.o表示编译连接后将生成param.o模块。

Ifneq ($(KERNELRELEASE))

param-objs := file1.o file2.o     //要编译的内核模块
obj-m := param.oelse          //编译成什么形式的.ko文件
KDIR := /lib/modules/2.6.18-53.el5/build     //指定内核模块需要使用内核源代码,并且指定相应的路径
All:
make -C $(KDIR) M=$(PWD) modules      //使用内核中的build的makefile来编译 modules
clean:
rm -f *.ko *.o *.mod  *.mod.c *.symvers     //清除