前言
第一次使用Markdown语法编辑的第一篇优快云技术文章,内容为本人第一个内核模块的入门教程,如有不完善的地方,请大家多多批评指正,支持开放、自由、分享,谢谢大家。
Linxu内核模块开发入门
1、简单的Linux内核模块编写和说明
以下是一段简单的Linux内核模块代码
//必要的头文件
#include<linux/init.h>
#include<linux/module.h>
#include<linux/kernel.h>
MODULE_LICENSE("GPL");//许可证
//模块的初始化函数,模块的入口函数,加载模块,需超级用户
static int __init first_init(void)
{
printk("my first kernel program!\n");
return 0;
}
//出口函数,卸载模块
static void __exit first_exit(void)
{
printk("end!\n");
}
module_init(first_init);//内核入口点,调用初始化函数,包含在module.h中
module_exit(first_exit);//出口点
2、编写Makefile
Makefile可以告诉编译程序的头文件在哪(本格式是在Ubuntu下),代码如下
#产生目标文件
obj-m:=hello.o
#路径变量,指明当前路径
CURRENT_PATH:=$(shell pwd)
#指明内核版本号
LINUX_KERNEL:=$(shell uname -r)
#指明内核源码的绝对路径
LINUX_KERNEL_PATH:=/usr/src/linux-headers-$(LINUX_KERNEL)
#编译模块
all:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
#清理模块
clean:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
3、内核的加载和卸载
若内核.c文件和Makefile文件编写正确,即可在当前目录下使用make命令编译,生成如下文件
- 模块加载命令:
sudo insmod hello.ko
- 模块删除命令:
sudo rmmod hello
4、查看结果
使用dmesg命令查看系统日志打印信息
结果显示如下图