本文主要是介绍Linux内核开发-编写一个内核模块,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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)/buildall: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
下一章:为内核模块写一个proc文件用于debug
这篇关于Linux内核开发-编写一个内核模块的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!