0.前言
上一章(点击返回上一章)已经完成了将ubuntu原始内核替换成了自己编好的内核。本章开始编写一个内核模块。
1.内核模块
1.1 什么是内核模块
Linux内核模块可独立于内核之外进行编译,可以在内核运行时动态加载、卸载。内核模块以.ko为后缀。
1.2 操作内核模块常用的指令
# 查看当前正在运行的模块
lsmod
#插入一个模块
insmod module_name
# 卸载一个模块
rmmod module_name
2. 编写一个内核模块
2.1 编写代码
开始编写一个keinel module(命名为km),第一个文件是km_main.c,内容如下:
#include <linux/kernel.h>
#include <linux/module.h> /* 内核模块必需的头文件 */
MODULE_LICENSE("GPL"); /* 声明这是GNU General Public License的任意版本 */
MODULE_AUTHOR("Myself"); /* 模块开发者,一般写开发者邮箱 */
MODULE_DESCRIPTION("Linux kernel module"); /* 模块功能简单描述 */
static int __init km_init(void) /* 模块初始化 */
{
int ret = 0;
printk("My kernel module init success!\n");
return ret;
}
static void __exit km_exit(void) /* 模块退出 */
{
printk("My kernel module exit success!\n");
}
module_init(km_init); /* 模块初始化函数声明:装载模块时从此函数开始运行 */
module_exit(km_exit); /* 模块退出函数声明:模块卸载时调用此函数 */
编写Makefile:
obj-m := km_main.o
# 获取当前使用的内核版本
KERNEL_PATH := $(shell uname -r)
# 当前内核目录
KDIR := /lib/modules/$(KERNEL_PATH)/build
all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.mod *.order
2.2 编译
直接在代码目录进行编译:
make
可以看到生成如下产物:
2.3 运行
2.3.1加载模块
insmod km_main.ko
注:如果不是在root下开发,需要加上sudo
查看是否加载成功:
lsmod
可以看到已经成功加载上了:
2.3.2卸载模块
rmmod km_main
lsmod即可看到模块已经卸载了
查看内核打印:
dmesg
可以看到代码中加的打印如下:
后续会逐步完善此内核模块,附上github地址可以看git log,看看整体的迭代记录(国内可能不能稳定,需要自己改DNS或科学上网)
github地址:github kernel_module
https://github.com/yicong-123/kernel_module