缺什么补什么:先认清你的能力缺口

很多从单片机或者纯应用层转过来的人,一上来就想写字符设备、搞设备树、调总线驱动,结果连一个最简单的内核模块都编译不过。这门课的主题非常明确:它不碰具体的硬件外设协议,而是专门解决嵌入式Linux驱动开发的“地基”问题。如果你在环境搭建、交叉编译、Makefile编写、模块参数传递这些前置环节卡壳,后面的驱动框架学起来就是空中楼阁。课程适合那些已经懂基础C语言、了解Linux基本命令,但没真正写过内核代码的学习者。如果你连gcc和make的基本逻辑都不清楚,建议先补完应用层的基础编译知识,再来看这门课的内容,否则在交叉编译环节会完全跟不上。

建议先看哪几块:把编译和模块跑通

别按顺序从头到尾看,挑最痛的地方先补。第一块必看的是环境搭建与Makefile详解,重点看怎么配置交叉编译环境,以及内核模块Makefile的编写逻辑。很多人写的Makefile在PC上能跑,放到开发板就报错,问题往往出在对内核源码树路径的指定和编译器前缀的理解上。第二块必看的是内核模块本身的机制,包括多源文件生成单一模块、模块间依赖关系、向模块传递参数的实现。这部分建议边看边敲,不要只看不动手。资料包里的示例代码不要直接编译,先自己照着写一遍,然后对比差异。配套练习的重点放在交叉编译上:自己写一个包含两个.c文件的模块,通过命令行传递参数控制打印内容,交叉编译后放到开发板验证。跑通这个流程,你才算真正跨进了驱动开发的门槛。

学完能做什么:独立完成模块级开发闭环

看完这门课,你应该能独立完成从编写源码、编写Makefile、交叉编译、到开发板加载调试的完整闭环。具体来说,你要能回答清楚几个问题:内核模块和普通应用程序在内存管理、执行权限、入口函数上有什么本质差异?多个源文件编译进同一个内核模块时,Makefile的写法和应用层有什么不同?内核模块之间有依赖时,加载顺序错了会出什么问题,怎么解决?向模块传递参数时,参数类型检查在内核里是怎么实现的?这些问题不是背概念,而是你在实际调试中必须能定位的错误点。资料包里的练习建议这样配合:先不看答案,自己写Makefile去编译资料里的模块示例,遇到报错先查内核日志,再看课程里对应的调试章节。这门课的价值不在于教你多高深的驱动框架,而在于帮你扫清写第一行驱动代码之前的所有障碍。别假装这些基础都会,编译报错和加载失败会教你做人。

课程目录

1 嵌入式驱动开发内容介绍 (15:08)
2 嵌入式驱动开发环境 (15:07)
3 Makefile详解-01 (14:20)
4 Makefile详解-02 (15:32)
5 Makefile详解-03 (24:27)
6 内核模块Makefile编写 (13:15)
7 内核模块的调试 (17:13)
8 编写内核代码需要注意的几个小问题 (10:10)
9 如何把多个源文件生成一个内核模块? (08:57)
10 如何向内核模块传递参数思路 (21:41)
11 向内核模块传递参数实现 (15:44)
12 内核模块的交叉编译-01 (16:02)
13 内核模块的交叉编译-02 (17:41)
14 内核模块间的依赖关系 (18:39)
15 内核模块和应用程序的差异 (15:06)