内核模块:给 Linux 内核做"热插拔插件"
嵌入式 Linux 设备里,硬件每代都要换驱动。如果把每个驱动都编译进内核镜像,改一行代码就要重刷整个固件,成本高昂且低效。内核模块正是为了解决这个痛点:它让驱动代码以 `.ko` 文件形式独立存在,**运行时按需加载、用完后卸载**,内核主体保持精简稳定,无需重启系统即可替换功能。这是理解整个 Linux 驱动生态的入口,后续所有的字符设备、平台总线、I2C/SPI 驱动,本质上都是内核模块的进阶形态。学完这门课,你能做到:
- 独立写出模块初始化与退出函数,理解 `module_init` 和 `module_exit` 的执行时机
- 熟练使用 `insmod`、`lsmod`、`rmmod` 完成加载到卸载的完整生命周期
- 在 x86 桌面或 ARM 开发板上,交叉编译出能在任意 Linux 发行版跑通的 Hello World 模块
- 掌握参数传递(`module_param`)、版本兼容性声明(`MODULE_LICENSE`)等工程规范
适合谁:有 C 基础,但没碰过内核态
这门课不是零基础教材。**需要你熟练掌握 C 语言**——能写结构体、指针、链表基础操作,熟悉 Makefile 基本语法,会用 `gcc` 或交叉编译工具链编译程序。如果你连 `make` 命令都没用过,建议先补一下 Linux 基础操作。课程不教 C 语法,也不讲编译器安装,而是直接假设你能在终端跑通一个 `hello.c`,然后把重点放在"如何把这段用户态代码变成能被内核加载的模块"。门槛不高,但确实需要命令行实战经验。
先看这几块:顺序比深度更重要
资料包内容从最薄的模块开始,**不要一上来就啃复杂的字符设备框架**。建议按这个顺序推进:
1. **模块骨架**——先跑通一个什么都不干的 `init/exit` 模板,建立"加载→打印→卸载"的信心,这是最重要的第一步
2. **参数与日志**——学习 `module_param` 传参和 `printk` 分级输出,这是以后调试驱动的唯一窗口,必须熟练
3. **字符设备框架雏形**——不需要完全掌握,但要理解"模块注册 `file_operations` 后,用户空间 `open/read/write` 才会生效"这个映射关系
不要跳过字符设备那段,那是后续所有驱动的底座。同时,遇到编译报错是常态,先对照环境变量(`KVERSION`、`ARCH`、`CROSS_COMPILE`)逐项排查,这个过程本身就是核心训练。
学完能独立做什么
完成核心内容后,你可以:
- 为一个已知硬件(比如一个简单的 GPIO 控制器或假想字符设备)写出**可加载、可卸载、可传参**的内核模块
- 用 `dmesg` 查看内核日志,定位模块加载失败的原因,不会一报错就抓瞎
- 在 Ubuntu Desktop 或开发板交叉编译环境下,**独立搭建模块编译环境**,知道为什么用 `make -C /lib/modules/$(uname -r)/build M=$(pwd)` 而不是直接 `make`
资料怎么配合练习
别只看视频。**每段理论后必须动手敲一遍模块,并在终端里 `insmod` 进去观察 `dmesg` 输出**,验证日志是否正常打印。模块加载失败是常态,能独立查清 `Invalid module format` 或 `Unknown symbol` 的原因,才算真正跨过门槛。记住:内核模块的精髓不在读懂,在调通。
课程目录
整理中,敬请期待。






