一、环境

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 #查看驱动卸载情况
  • 查看挂载情况

    lsmod
    
    cat /proc/devices