Linux内核模块开发:hello world模块编写 | linux-tutorial
一、为什么需要内核模块
你是否曾想过:为什么安装某些驱动时不需要重启系统?为什么有些功能可以动态添加到Linux内核中?答案就藏在内核模块(Kernel Module) 技术里。
内核模块是一种可以在系统运行时动态加载到内核中的代码,它扩展了Linux内核的功能,却不需要重新编译内核或重启系统。这对设备驱动开发、文件系统扩展等场景至关重要。
二、环境准备
2.1 安装开发依赖
首先需要安装内核头文件和编译工具:
# Ubuntu/Debian系统
sudo apt-get install linux-headers-$(uname -r) build-essential
# CentOS/RHEL系统
sudo yum install kernel-devel gcc make
相关工具脚本可参考:系统工具安装脚本
2.2 查看内核版本
确认内核版本和头文件是否匹配:
uname -r # 查看内核版本
ls /lib/modules/$(uname -r)/build # 确认头文件目录
三、编写第一个内核模块
3.1 模块源代码
创建文件 hello.c,内容如下:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
// 模块加载函数
static int __init hello_init(void) {
printk(KERN_INFO "Hello, World! 内核模块加载成功\n");
return 0; // 0表示加载成功
}
// 模块卸载函数
static void __exit hello_exit(void) {
printk(KERN_INFO "Goodbye, World! 内核模块卸载成功\n");
}
// 模块注册
module_init(hello_init);
module_exit(hello_exit);
// 模块元信息
MODULE_LICENSE("GPL"); // 许可证声明(必须)
MODULE_AUTHOR("Linux Tutorial"); // 作者信息
MODULE_DESCRIPTION("Hello World内核模块示例"); // 模块描述
MODULE_VERSION("0.1"); // 模块版本
3.2 Makefile编写
创建 Makefile,内容如下:
obj-m += hello.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
四、编译与加载模块
4.1 编译模块
执行编译命令:
make
编译成功后会生成 hello.ko 文件(这就是我们的内核模块)。
4.2 加载模块
sudo insmod hello.ko
4.3 查看模块是否加载
lsmod | grep hello
4.4 查看模块输出信息
内核模块的输出信息不会显示在终端,而是记录在系统日志中:
dmesg | grep "Hello, World"
4.5 卸载模块
sudo rmmod hello
再次查看日志确认卸载信息:
dmesg | grep "Goodbye, World"
五、核心代码解析
5.1 模块入口与出口
module_init(hello_init): 指定模块加载时执行的函数module_exit(hello_exit): 指定模块卸载时执行的函数
5.2 printk函数
printk 是内核态的打印函数,与用户态的 printf 类似,但有以下区别:
- 必须指定日志级别(如
KERN_INFO) - 输出到内核环形缓冲区,需用
dmesg命令查看 - 不支持浮点数格式化
5.3 模块元信息
MODULE_LICENSE: 声明模块许可证,常用GPLMODULE_AUTHOR: 作者信息MODULE_DESCRIPTION: 模块功能描述MODULE_VERSION: 模块版本号
六、常见问题解决
6.1 编译错误:找不到内核头文件
确保已安装对应版本的内核头文件:
sudo apt-get install linux-headers-$(uname -r)
相关脚本参考:系统设置脚本
6.2 权限问题
加载/卸载模块需要root权限,必须使用 sudo。
6.3 模块依赖
如果模块依赖其他模块,需先加载依赖模块。可使用 modinfo hello.ko 查看模块依赖。
七、进阶学习资源
- Linux内核模块开发官方文档
- 内核模块Makefile编写指南
- 实用Shell脚本集合
- 系统运维手册
八、总结
本文介绍了Linux内核模块的基本概念,通过一个简单的"hello world"示例,展示了内核模块的编写、编译、加载和卸载过程。内核模块是Linux系统中非常强大的功能,掌握它将为你打开设备驱动开发、内核调优等领域的大门。
想要深入学习?可以继续探索:
- 模块参数传递
- 内核线程创建
- 设备文件操作
- 内核调试技术
开始你的内核探索之旅吧!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



