如果你写过字符设备驱动,能编译出 .ko 并 insmod 成功,但被问到"中断上半部和下半部到底怎么分"、"自旋锁和互斥锁在中断上下文里为什么不能随便换"时答不上来,这门课就是冲这些缺口去的。它不是从零讲 C 语言和 Linux 命令的入门课,默认你已经能看懂内核源码目录结构、能独立编译模块,接下来要补的是内核里那些"能跑通但说不清"的部分。

先确认你缺的是哪一块

内核驱动开发的坑往往不在"写不出来",而在"写出来之后不敢改"。下面这些场景,中两条以上就说明该系统过一遍了:

  • 申请中断时知道要填 handler,但分不清 request_irq 的 flags 里 IRQF_SHARED 和 IRQF_TRIGGER_* 各自解决什么问题;
  • 驱动里用了自旋锁,但说不清它保护的是数据还是代码路径,也不知道为什么持锁期间不能睡眠;
  • 看过 wait_queue 和 completion 的代码,但换到自己写的驱动里就不知道选哪个;
  • 知道有 workqueue 和 tasklet,但面对一个具体的中断处理需求,判断不出该延迟到哪种上下文执行;
  • 改过驱动里的 open/release/ioctl,但 file_operations 与内核对象生命周期的对应关系一直模糊。

这些问题的共同点是:它们都落在"内核机制"和"驱动写法"的交叉处。只背 API 记不住,只看内核源码又太散,需要一个把机制和代码放在一起讲的中间层。

课程覆盖的核心线索

课程沿两条线推进:一条是内核提供的并发与异步机制,另一条是驱动如何把这些机制用对。中断部分不只讲注册注销,更强调上半部要快、下半部怎么选;锁的部分把原子操作、自旋锁、信号量、互斥体放在同一张对比表里,重点讲清各自适用的上下文和睡眠语义;文件系统相关的内容则把 VFS 层与具体驱动的接口对上,帮助你理解用户态一次 read/write 到底经过了哪些内核路径。

这几块拼起来,正好对应驱动开发中最容易被面试和线上问题问住的地方。比如一个中断频繁触发的设备,handler 里做多少事、剩下的交给谁、共享数据用什么保护——这不是三个独立知识点,而是一个必须整体决策的设计问题。

看完应该能回答的问题

判断有没有学到位,不看记了多少 API,看能不能把这些说清楚:

  • 为什么中断上下文里不能调用可能睡眠的函数?如果非要做耗时操作,有哪几种延迟执行方式,各自的上下文是什么?
  • 自旋锁和互斥体在同一段临界区代码里能不能互换?换错会出什么问题?
  • 一个驱动同时被多个进程 open,你的私有数据结构应该挂在哪里,什么时候释放?
  • 用户态 write 返回成功,数据是不是一定已经写到硬件了?中间可能经过哪些缓存层?
  • 模块卸载时,怎样保证没有中断处理程序还在引用你即将释放的内存?

能答上大部分,说明你补的不是零散知识,而是一套能落到代码里的判断依据。

怎么用这份资料

建议边看边在自己机器上跑:写一个最简单的字符设备,注册一个中断,然后用并发读写去压它,观察加锁和不加锁的差别。课程里的机制讲解只有落到你自己敲的代码上才变成能力。如果手头没有真实硬件,用内核里的虚拟设备或 QEMU 环境也能完成大部分练习。

配套练习不必多,但每个机制至少要自己写一遍、故意写错一次、再改对。比如把该用自旋锁的地方换成互斥体,看内核报什么错——这种错误信息比任何讲解都记得牢。

51CTO - Linux内核驱动开发视频课程

深入内核,掌握驱动开发

编辑点评

系统学习Linux内核驱动开发,从基础到进阶,涵盖中断、锁、文件系统等多个方面。

⭐ 编辑推荐

本课程深入浅出地讲解Linux内核驱动开发,适合有志于在操作系统领域深入发展的开发者。

课程亮点

• 系统学习内核驱动开发
• 涵盖中断、锁、文件系统等核心技术
• 实践性强,案例丰富

课程目录

51CTO-Linux内核驱动开发视频课说明.png  [493.5 KB]
37.中断共享.mp4  [39.3 MB]
41.应用层互斥锁的使用.mp4  [76.8 MB]
02.内核源码查看方法.mp4  [48.9 MB]
34.小节复习.mp4  [63.6 MB]
56.小节复习.mp4  [41.9 MB]
58.platform之资源获取实例.mp4  [58.8 MB]
65.I2C控制器的内核驱动框架分析.mp4  [206.7 MB]
55.platform总线机制.mp4  [90.6 MB]
54.驱动模型之总线、设备、驱动思想.mp4  [172.2 MB]
57.platform总线匹配规则实例.mp4  [58.3 MB]
70.操作LCD之frambuffer的APP程序一.mp4  [118.3 MB]
77.proc文件系统之可读写文件的创建.mp4  [117.5 MB]
66.5点触控触摸屏驱动编写一.mp4  [216.3 MB]
74.LCD驱动框架分析二.mp4  [111.4 MB]
53.驱动模型思想机制及涉及接口.mp4  [105.5 MB]
68.基于I2C控制器的从机驱动扩展.mp4  [134.1 MB]
67.5点触控触摸屏驱动编写二.mp4  [198.1 MB]
75.proc文件创建之LED驱动.mp4  [106.8 MB]
76.proc文件创建之内核缓存设备驱动.mp4  [63.1 MB]
32.高级字符设备驱动之ioctl接口实现led操作.mp4  [102.7 MB]
09.系统调用函数实现的本质.mp4  [139.3 MB]
45.内核加锁机制之互斥锁和自旋锁.mp4  [67.6 MB]
51.input子系统关于单点触控触摸屏数据的上报.mp4  [152.7 MB]
35.内核中断请求接口.mp4  [66.4 MB]
04.根文件系统的制作.mp4  [40.2 MB]
24.内核缓存设备驱动的测试app编写.mp4  [23.5 MB]
22.LED之字符设备驱动的第二种注册方式及app编写.mp4  [85.7 MB]
62.小节复习.mp4  [88.7 MB]
71.操作LCD之frambuffer的APP程序二.mp4  [104.0 MB]
17.内核中动态申请内存空间的接口.mp4  [177.8 MB]
33.利用gpio子系统操作led驱动.mp4  [135.8 MB]
21.LED字符设备驱动.mp4  [217.9 MB]
28.poll驱动接口之应用层select测试.mp4  [132.3 MB]
43.避免死锁.mp4  [16.9 MB]
03.内核和文件系统的烧写.mp4  [57.7 MB]
20.系统调用和内核驱动之间的调用过程.mp4  [149.9 MB]
29.poll驱动接口之应用层poll测试.mp4  [37.7 MB]
25.小节复习.mp4  [40.3 MB]
69.为5点触控触摸屏驱动编写Kconfig.mp4  [19.8 MB]
01.内核驱动开发概述.mp4  [148.2 MB]
05.内核编译组织结构.mp4  [45.9 MB]
38.中断下半部之tasklet实现机制.mp4  [93.3 MB]
47.自旋锁解决进程和中断下半部之间的竞争.mp4  [45.5 MB]
40.定制linux内核的启动logo.mp4  [113.0 MB]
72.内核获取bootloader的bootargs环境变量.mp4  [63.4 MB]
73.LCD驱动框架分析一.mp4  [143.5 MB]
61.测试蜂鸣器驱动之app.mp4  [43.1 MB]
13.驱动模块的编写技术.mp4  [176.3 MB]
59.SOC各种控制器的设备对象和驱动对象之组织框架.mp4  [123.2 MB]
52.input子系统关于多点触控触摸屏数据的上报.mp4  [43.6 MB]
14.系统调用和驱动模块的串讲.mp4  [50.4 MB]
15.内核双向循环链表的思想机制.mp4  [151.4 MB]
64.基于ADC的定位器电压值抽样驱动及app编写.mp4  [108.7 MB]
50.利用input子系统编写功能键设备驱动.mp4  [155.8 MB]
23.一套驱动支持多个设备的内核缓存设备驱动编写技术.mp4  [212.4 MB]
36.双边沿触发按键中断注册.mp4  [69.8 MB]
39.中断下半部之workqueue实现机制.mp4  [66.4 MB]
19.古老的字符设备驱动注册接口及代码实例.mp4  [144.7 MB]
44.内核加锁机制之信号量.mp4  [157.1 MB]
16.内核操作双向循环链表的接口精讲及应用实例.mp4  [189.9 MB]
60.pwm驱动蜂鸣器驱动.mp4  [161.5 MB]
30.poll驱动接口之应用层epoll测试.mp4  [56.1 MB]
46.自旋锁解决进程和中断之间的竞争.mp4  [63.6 MB]
49.获取鼠标键盘触摸屏等输入设备数据app编写.mp4  [163.4 MB]
48.原子操作.mp4  [113.5 MB]
10.内核中实现并添加亮灭led的系统调用函数.mp4  [148.2 MB]
80.复习二.mp4  [20.3 MB]
11.应用层测试内核中添加的系统调用函数实现led的亮灭.mp4  [32.2 MB]
26.内核缓存设备驱动之进程阻塞.mp4  [102.8 MB]
08.Kconfig和Makefile之间的关系.mp4  [86.3 MB]
18.设备驱动的分类、设备文件和内核驱动之间的关联.mp4  [101.2 MB]
42.应用层自旋锁的使用.mp4  [18.4 MB]
79.复习一.mp4  [113.3 MB]
78.内核系统时间的获取.mp4  [91.5 MB]
27.内核缓存设备驱动之IO复用poll接口实现.mp4  [57.0 MB]
07.Kconfig文件语法.mp4  [104.2 MB]
31.混杂字符设备驱动注册方法之led驱动.mp4  [47.8 MB]
63.adc控制器的内核驱动框架结构.mp4  [157.3 MB]
12.驱动模块的编写技术.mp4  [153.8 MB]
06.Kconfig文件语法.mp4  [16.8 MB]

适合人群

  • Linux内核开发者
  • 操作系统爱好者
  • 嵌入式系统工程师

学习收获

掌握内核驱动开发流程
了解内核数据结构和算法
提升操作系统开发能力

祝您学习愉快!

学有所成,前程似锦!