阅读Linux驱动源码是理解Linux内核工作原理和开发驱动程序的重要途径。以下是一些系统性的方法和建议:
apt-get install linux-source
或从kernel.org下载典型的Linux驱动包含以下关键部分:
/drivers/
├── char/ # 字符设备驱动
├── block/ # 块设备驱动
├── net/ # 网络设备驱动
├── input/ # 输入设备驱动
├── usb/ # USB驱动
└── ...
从用户空间接口开始:
/dev/
下的设备节点file_operations
结构体中的函数指针跟踪系统调用路径:
open()
-> sys_open()
-> chrdev_open()
-> 驱动中的open
函数从模块初始化开始:
module_init()
和module_exit()
register_chrdev()
, platform_driver_register()
等分析设备探测流程:
pci_driver
结构体中的.probe
函数platform_driver
中的.probe
函数重点关注以下内核数据结构:
file_operations
- 文件操作接口cdev
- 字符设备结构device_driver
/platform_driver
- 设备驱动结构request_queue
- 块设备请求队列net_device
- 网络设备结构源码浏览工具:
cscope
:建立代码索引,快速跳转ctags
:生成标签文件vim + ctags
或emacs + etags
组合调试工具:
printk
:内核日志输出strace
:跟踪系统调用gdb
+ kgdb
:内核调试文档工具:
kernel-doc
:提取内核文档注释Documentation/
目录下的文档Documentation/driver-model/
目录通过系统性的阅读和实践,你将能够逐步掌握Linux驱动的工作原理和开发方法。