阅读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驱动的工作原理和开发方法。