Linux的驱动程序注册过程,大致分为两个步骤:
- 模块初始化
- 驱动程序注册
1. 模块初始化
1.1 驱动程序入口
所有的设备驱动程序都会有如下两行代码:
1922 module_init(netdrv_init_module);
1923 module_exit(netdrv_cleanup_module);
module_init/module_exit是两个宏。module_init是该驱动程序的入口,加载驱动模块时,驱动程序就从netdrv_init_module函数开始执行。而当该驱动程序对应的设备被删除了,则会执行netdrv_cleanup_module这个函数。
1.2 模块初始化
当驱动程序开始执行时,首先会执行该驱动程序的初始化函数netdrv_init_module,代码如下:
1906 static int __init netdrv_init_module(void)
1907 {
1908 /* when a module, this is printed whether or not devices are found in probe */
1909 #ifdef MODULE
1910 printk(version);
1911 #endif
1912 return pci_register_driver(&netdrv_pci_driver);
1913 }
可以看到,初始化函数很简单,只执行了一个pci_register_driver函数就返回了。
其实模块的初始化过程就是这么简单,这也是linux驱动程序的ISO标准流程:module_init-->xx_init_module-->xx_register_driver。相信你看着这里时,还是一头雾水。别着急,我们慢慢来。
2. 驱动程序注册
什么是驱动模块的注册?上面讲到的初始化函数中调用的pci_register_driver函数就是注册驱动程序啦。在介绍注册函数之前,必须要详细说明下linux的总线设备驱动模型,否则下面的内容很难描述清楚。
2.1 linux总线设备驱动模型
关于总线设备驱动模型,很多书上都有详细的讲解,但是都很抽象,很难理解(至少我是这样认为的)。下面我尽量用最简单的方法来说明相关内容。
linux内核中分别用struct bus_type,struct device和struct device_driver来描述总线、设备和驱动。
总线:
50 struct bus_type {
51 const char *name;
52 struct bus_attribute *bus_attrs;
53 struct device_attribute *dev_attrs;
54 struct driver_attribute *drv_attrs;
55
56 int (*match)(struct device *dev, struct device_driver *drv);
。。。
68 };
设备:
406 struct device {
407 struct device *parent;
408
409 struct device_private *p;
410
411 struct kobject kobj;
412 const char *init_name; /* initial name of the device */
413 struct device_type *type;
414
415 struct mutex mutex; /* mutex to synchronize calls to
416 * its driver.
417 */
418
419 struct bus_type *bus; /* type of bus device is on */
420 struct device_driver *driver; /* which driver has allocated this
421 device */
。。。
456
457 void (*release)(struct device *dev);
458 };
驱动:
122 struct device_driver {
123 const char *name;
124 struct bus_type *bus;
125
126 struct module *owner;
127 const char *mod_name; /* used for built-in modules */
128
129 bool suppress_bind_a