# Linux 内核模块开发

上一篇：[[15 Linux 进程间通信]]
返回目录：[[Linux 学习指南]]
下一篇：[[17 Linux 字符设备驱动]]

> [!info] 来源
> 整理自 [[操作系统课程设计指导书]] 的实验二。

## 模块结构

内核模块通常包含头文件、许可证声明、初始化函数和清理函数：

```c
static int __init demo_init(void) { printk(KERN_INFO "loaded\n"); return 0; }
static void __exit demo_exit(void) { printk(KERN_INFO "unloaded\n"); }
module_init(demo_init);
module_exit(demo_exit);
MODULE_LICENSE("GPL");
```

`printk` 的输出可通过 `dmesg` 查看；模块运行在内核空间，错误可能影响整个系统，应在虚拟机中实验。

## 编译与加载

```make
obj-m += demo.o
all:
\tmake -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
\tmake -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
```

```bash
make
sudo insmod demo.ko
lsmod | grep demo
dmesg | tail
sudo rmmod demo
```

`insmod` 按文件加载模块；`modprobe` 会根据模块依赖处理加载，更适合系统管理。卸载前确认没有进程正在使用模块提供的资源。
