字符设备驱动
从零开始系统学习 Linux 字符设备驱动开发,覆盖老 API 到新 API 的完整演进
版本说明
本教程提供多个内核版本的实现:
- 老内核版本(Linux 4.1.15):仅供参考,标记为"历史版本"
- 新内核版本(Linux 6.12.49 / 7.0.0-rc4):推荐学习,包含最新特性
学习路径
本教程采用渐进式学习路径,从基础概念到实际开发,系统性地掌握字符设备驱动开发技能。
🎯 推荐学习路径(完整版)
适合初学者,按顺序学习建立完整的知识体系:
阶段一:基础理论(1-5)
- 01_introduction.md - 字符设备驱动简介
- 02_kernel_space_basics.md - 内核空间基础与硬件访问
- 03_kernel_module_mechanism.md - 内核模块机制
- 04_kernel_print_guide.md - 内核打印详解
- 05_kernel_debug_techniques.md - 内核调试技术
阶段二:API 演进与实战(6-11)
- 06_legacy_chardev.md - 老API:虚拟字符设备 💻
- 06p_ide_setup.md - IDE 配置指南 🛠️
- 07_hardware_overview.md - LED 硬件基础 🔥
- 08_memory_mapped_io.md - 内存映射 I/O 深度解析 ⭐⭐⭐
- 09_hardware_abstraction_layer.md - 硬件抽象层设计 🔧
- 10_chardev_implementation.md - 字符设备驱动实现 💻
- 11_build_test_deploy.md - 构建、测试与部署实战 🚀
阶段三:新 API 专题(12-18)
- 12_new_chardev_api_overview.md - 新 API 概览与设计理念 ⭐⭐⭐
- 13_cdev_and_device_number.md - cdev 与设备号管理 ⭐⭐⭐
- 14_class_device_model.md - class 和 device 模型 ⭐⭐⭐
- 15_error_handling_patterns.md - 驱动错误处理模式 ⭐⭐
- 16_device_structure_in_new_api.md - 新 API 设备结构体 ⭐⭐
- 17_new_api_driver_analysis.md - 新 API 驱动代码深度解析 ⭐⭐⭐
- 18_app_development_and_testing.md - 应用开发与真实测试 ⭐
🚀 快速路径(有经验开发者)
如果你已经有内核开发经验:
- 直接阅读 12_new_chardev_api_overview.md 了解新API概览
- 跟随 13_cdev_and_device_number.md 深入学习 cdev 和设备号
- 跟随 14_class_device_model.md 了解 class 和 device 模型
- 跟随 17_new_api_driver_analysis.md 深入分析驱动代码
- 跟随 18_app_development_and_testing.md 了解应用开发和测试
章节目录
阶段一:基础理论
阶段二:API 演进与实战
阶段三:新 API 专题
双轨内核支持
| 轨道 | 版本 | 说明 |
|---|---|---|
| linux-imx | 6.12.49 推荐 | NXP BSP,针对 i.MX 优化 |
| mainline | 7.0.0-rc4 进阶 | 上游主线,最新特性 |
学习目标
掌握字符设备驱动的完整开发流程:从 file_operations 到新 API 的"三步走"机制,独立编写生产级驱动代码。
前置知识
C 语言高级特性 · Linux 内核基础 · 硬件基础知识
常见问题
Q: 新老内核的 API 兼容吗?
A: 核心字符设备 API 保持兼容,老代码在新内核上也能运行,但不推荐新驱动使用老 API。
Q: 如何选择动态分配还是静态分配设备号?
A: 推荐使用动态分配(alloc_chrdev_region),避免设备号冲突。
Q: 必须使用 class_create 和 device_create 吗?
A: 不是强制的,但强烈推荐,可以自动创建设备节点。
Q: 为什么要学习 02-05 基础教程?
A: 这些教程建立了必要的内核基础概念,理解这些内容会让后续的驱动开发事半功倍。如果你已经有内核开发经验,可以跳过。