Linux内核模块编程

建文件夹名字为插入到系统模块里面的名称.c文件
makefile没有后缀名 【作业说明书
默认当前后缀下寻找

hello world”的示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
static int hello_init(void)
{
printk(KERN_ALERT"hello,world\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT"goodbye\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");

头文件声明:

第 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

文章目录
  1. 1. 头文件声明:
  2. 2. 模块许可申明:
  3. 3. 初始化与清理函数的注册:
|