Linux驱动项目实战50例

深入Linux内核开发,掌握驱动编程精髓

本课程通过50个精心设计的实战项目,带你从零开始掌握Linux驱动开发的核心技术与实践方法。每个项目都聚焦一个关键技术点,循序渐进构建完整的驱动开发知识体系。

章节 项目名称与描述
01 "生命信号"驱动:创建一个每秒钟自动递增一次的计数器,通过 /proc 或 sysfs 供用户读取。
02 内核日志过滤器:一个字符设备,用户向其写入字符串,驱动只将包含特定关键词的字符串用 printk 打印出来。
03 消息槽(Message Slot):实现一个设备,多个进程可以向其写入消息,另一个进程可以读取最后一条消息。学习并发控制。
04 简易密码存储器:通过 ioctl 设置一个密码,通过 read 操作验证密码是否正确。
05 信号量模拟器:实现一个字符设备,模拟一个系统信号量,支持 up/down 操作。
06 内存幻象器 (RAM Disk Lite):在内核分配一页内存,通过 read/write 操作这块内存。
07 内核命令行计算器:向设备写入 5+3 这样的字符串,读取操作返回 8。
08 延迟响应设备:当用户写入数据后,驱动启动一个内核定时器,在5秒后才处理数据并发出通知。
09 驱动参数实验:编写一个驱动,支持在加载时传入参数(如 insmod my_drv.ko debug_level=1)。
10 设备类展示:自动在 /sys/class/ 下创建一个类,并在其中显示设备信息。
11 多设备驱动:一个驱动模块同时创建3个相同的字符设备(如 /dev/vdev0, vdev1, vdev2)。
12 循环缓冲区驱动:实现一个内核空间的循环缓冲区,用户进程可以从中读写数据。
13 自毁驱动:加载后,在 sysfs 中创建一个文件,向该文件写入特定内容后,驱动自动卸载自己。
14 时间戳设备:任何 read 操作都返回当前内核时间戳(ktime_get())。
15 "永不阻塞"测试驱动:实现 read 和 write 方法,但总是返回 -EAGAIN,测试用户态的非阻塞IO。
16 QEMU虚拟硬件中断:在QEMU中为虚拟PCI设备或平台设备编写一个非常简单的中断处理程序,触发后打印信息。
17 软件中断(SoftIRQ)实践:自定义一个软中断,并在驱动中触发它。
18 Tasklet小任务:在中断顶半部调度一个tasklet,在底半部打印信息。
19 工作队列(Workqueue)处理器:启动一个工作队列,定期打印一条消息。
20 高精度定时器(hrtimer)闹钟:编写一个驱动,在用户写入一个时间值后,用hrtimer实现精准的定时回调。
21 按键防抖动(Debouncer)模拟:在定时器中断中模拟按键信号,并实现软件防抖动逻辑。
22 中断频率限制器:编写一个驱动,限制特定中断产生的最高频率(如每秒最多100次)。
23 内核线程看守者:创建一个内核线程,它每隔10秒打印一次自己的状态。
24 页面分配器测试:分配不同阶数(order)的连续物理页,并通过 read 操作查看信息。
25 SLAB分配器展示:创建自己的SLAB缓存,并从中分配/释放对象。
26 用户态内存映射(mmap):将驱动中分配的单个页面映射到用户空间。
27 虚拟DMA模拟:在没有真实DMA硬件的情况下,使用 memcpy 模拟DMA传输的流程(申请缓冲区、启动"传输"、完成中断)。
28 一致性DMA映射演示:使用 dma_alloc_coherent 分配一段DMA缓冲区,并将其内容导出给用户空间查看。
29 流式DMA映射演示:使用 dma_map_single 映射一块普通内核缓冲区用于"DMA"。
30 OOM(内存耗尽)测试器:一个尝试分配大量内存直到触发内核OOM killer的驱动。
31 虚拟平台设备:在QEMU命令行用 -device 创建一个虚拟设备,并为它编写驱动。
32 "Hello, Device Tree":编写一个最简单的设备树节点(.dts),并在驱动中读取它的 compatible 属性。
33 设备树资源获取:从设备树节点中解析并获取虚拟的内存地址和中断号。
34 Sysfs属性控制:为驱动创建自定义的 sysfs 属性文件,实现读写回调。
35 平台驱动匹配:编写一个平台驱动,通过 compatible 字符串与QEMU中的虚拟设备匹配。
36 GPIO模拟器:模拟一个GPIO控制器,允许用户通过 sysfs 或 ioctl 设置"引脚"电平和方向。
37 时钟(Clock)模拟器:模拟一个时钟源,提供频率设置和使能/禁用操作。
38 复位(Reset)控制器模拟:模拟一个简单的复位控制器。
39 LED心跳灯模拟:在驱动中创建一个虚拟LED设备,并实现类似心脏跳动的定时闪烁模式。
40 虚拟温度传感器:模拟一个温度传感器,其返回值可以通过 sysfs 进行设置。
41 只读内存块设备:将一段内核内存(如一个静态数组)包装成一个只读的块设备。
42 可写RAM块设备:实现一个简单的可读写的RAM磁盘驱动。
43 循环块设备过滤器:包装一个已有的块设备(如 ram0),拦截其 read 请求并打印调试信息。
44 虚拟网络隧道端点:编写一个极简的虚拟网络设备,将收到的所有数据包原样发回(loopback)。
45 数据包计数器:一个网络设备驱动,仅用于统计收到的数据包数量和大小。
46 内核模块依赖:编写两个模块,A依赖B导出的一个符号(函数或变量)。
47 Notifier Chain观察者:注册一个重启notifier,在系统重启时打印一条消息。
48 Procfs数据查看器:在 /proc 下创建一个文件,显示驱动内部的一些状态信息。
49 Debugfs控制器:在 /sys/kernel/debug/ 下创建文件,用于动态改变驱动的调试级别。
50 "Faulty"驱动(错误注入):编写一个有意的buggy驱动(如写入时内存越界),学习如何使用 KASAN 等工具捕捉它。