一、环境
apt update
apt install linux-headers-$(uname -r)
二、编写文件
- 001_helloworld.c
#include <linux/init.h>
#include <linux/module.h>
// 模块许可证声明,必须是 GPL 兼容的许可证才能加载到内核中
MODULE_LICENSE("GPL");
// 模块作者信息
MODULE_AUTHOR("wyl");
// 模块描述
MODULE_DESCRIPTION("Hello World");
// 模块加载时调用的函数
static int hello_init(void)
{
printk("Hello, World! Driver loaded.\n");
return 0; // 返回 0 表示加载成功
}
// 模块卸载时调用的函数
static void hello_exit(void)
{
printk("Goodbye, World! Driver unloaded.\n");
}
// 注册模块的入口和出口函数
module_init(hello_init);
module_exit(hello_exit);
- Makefile
# 如果未定义 KERNELDIR,则使用当前运行的内核版本路径
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
# 当前目录
PWD := $(shell pwd)
# 模块名称,对应 .c 文件名去掉 .c 后缀
obj-m := 001_helloworld.o
# 默认目标:编译模块
all:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules #-C : Change Directory(切换目录) -M : Module Directory(模块目录) modules : Make Target(构建目标)
# 清理目标
clean:
$(MAKE) -C $(KERNELDIR) M=$(PWD) clean
# 安装模块 (可选)
install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
# 卸载模块 (可选)
uninstall:
rm -f /lib/modules/$(shell uname -r)/extra/001_helloworld.ko
depmod -a
- 编译使用
make #必须使用root用户
insmod 001_helloworld.ko #加载驱动,必须使用root用户
dmesg | tail #查看驱动加载情况
rmmod 001_helloworld #卸载驱动,必须使用root用户
dmesg | tail #查看驱动卸载情况
-
查看挂载情况
lsmodcat /proc/devices