一、说明
笔者在这里将介绍怎样在Ubuntu 18.04 64位机上创建简单的内核模块。参考书籍为《Operating System》英文版
二、实验步骤
- 编写内核模块代码simple.c,内容如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
//模块加载时运行此函数
int simple_init(void) //模块入口点没有传入参数(void)
{
printk(KERN_INFO "Loading Module\n");
return 0; //模块入口点必须返回int,0:成功 !0:失败
}
//模块删除时运行此函数
void simple_exit(void) ////模块离开点没有传入参数(void)
{
printk(KERN_INFO "Removing Module\n");
}
//用于注册模块入口点和出口点的宏
module_init(simple_init); //模块入口点
module_exit(simple_exit); //模块离开点
MODULE_LICENSE("GPL"); //模块证书
MODULE_DESCRIPTION("Simple Module"); //模块描述
MODULE_AUTHOR("SGG"); //模块作者 - 编写Makefile,请严格注意tab,确保您的编辑器不会将tab替换为空格
1
2
3
4
5
6obj-m := simple.o
all:
make -C /usr/src/linux-4.18.14/ M=$(shell pwd) modules
clean:
make -C /usr/src/linux-4.18.14/ M=$(shell pwd) clean - 开始编译,命令为
1
sudo make
注:这个过程很快,大概1s左右
三、内核模块基本操作
由于内核日志缓冲区填充快速,所以定期清除缓冲区通常是必要的。可以使用下面命令,笔者这里首先清空了内核日志缓冲区.
- 清空内核日志缓冲区
1
sudo dmesg -C
- 加载模块当模块正常载入,根据模块代码,应该会执行simple_init函数。使用dmesg查看内核日志缓冲区,如下图
1
sudo insmod simple.ko
- 判断模块是否载入
1
sudo lsmod
- 删除模块当模块正常卸载,根据模块代码,应该会执行simple_exit函数。使用dmesg查看内核日志缓冲区,如下图
1
sudo rmmod simple