建文件夹名字为插入到系统模块里面的名称.c文件
makefile没有后缀名 【作业说明书
默认当前后缀下寻找
hello world”的示例代码如下:
头文件声明:
第 1、2 行是模块编程的必需头文件。module.h 包含了大量加载模块所需要的函数和符
号的定义;init.h 包含了模块初始化和清理函数的定义。如果模块在加载时允许用户传递参
数,模块还应该包含 moduleparam.h 头文件。
模块许可申明:
MODULE_LICENSE("GPL")
是模块许可声明。Linux 内核从 2.4.10 版本内核开始,模块必须通过MODULE_LICENSE 宏声明此模块的许可证,否则在加载此模块时,会收到内核被污染 “kernel tainted” 的警告。从 linux/module.h 文件中可以看到,被内核接受的有意义的许可证有 “GPL”,
“GPL v2”,“GPL and additional rights”,“Dual BSD/GPL”,“Dual MPL/GPL”,“Proprietary”,其中“GPL” 是指明这是 GNU General Public License 的任意版本,其他许可证大家可以查阅资料进一步了解。MODULE_LICENSE 宏声明可以写在模块的任何地方(但必须在函数外面),不过惯例是写在模块最后。
初始化与清理函数的注册:
初始化函数通常定义为:
static int init init_func(void)
{
//初始化代码
}
module_init(init_func);
般情况下,初始化函数应当申明为 static,以便它们不会在特定文件之外可见。如果
该函数只是在初始化使用一次,可在声明语句中加init 标识,则模块在加载后会丢弃这个
初始化函数,释放其内存空间。
清理函数通常定义为:
static void exit exit_func(void)
{
//清理代码
}
module_exit(exit_func);
清理函数没有返回值,因此被声明为 void。声明语句中的exit 的含义与初始化函数中
的__init 类似,不再重述。
obj-m :=hello.o //生成的模块名称是:hello.ko
KDIR :=/lib/modules/$(shell uname -r)/build
PWD :=$(shell pwd) // PWD 是当前目录
default:
make -C $(KDIR) M=$(PWD) modules // -C 指定内核源码目录,M 指定模块源码目录
clean:
make -C $(KDIR) M=$(PWD) clean