设备的绑定,是将设备以及控制它的驱动程序联系到一起。这个过程通常是由总线驱动程序来实现的。

Bus

总线类型结构包含系统中该总线类型上所有设备的列表。当为设备调用device_register时,它将被插入此列表的末尾。总线对象还包含该总线类型的所有驱动程序的列表。当为驱动程序调用driver_register时,它将被插入此列表的末尾。这是两个触发驱动程序绑定的事件。

device_register

添加新设备后,将遍历总线的驱动程序列表以找到支持该设备的驱动程序。为了确定这一点,设备的设备ID必须与驱动程序支持的设备ID之一匹配。比较ID的格式和语义是特定于总线的。与其尝试派生复杂的状态机和匹配算法,不如由总线驱动程序提供回调以将设备与驱动程序的ID进行比较。如果找到匹配项,则总线返回1;否则,返回0。否则为0。

  1. int match(struct device * dev, struct device_driver * drv);

如果找到匹配项,则将设备的驱动程序字段设置为驱动程序,并调用驱动程序的探测回调。这使驱动程序有机会验证它确实支持硬件,并且处于工作状态。

Device Class

成功完成探测后,将向设备注册所属的类。设备驱动程序仅属于一类,并且在驱动程序的devclass字段中设置。调用devclass_add_device枚举类中的设备并在类中实际注册设备,这在类的register_dev回调中发生。

Driver

将驱动程序连接到设备后,该设备将插入驱动程序的设备列表中。

sysfs

在总线的“设备”目录中创建一个符号链接,该链接指向物理层次结构中的设备目录。
在驱动程序的“设备”目录中创建一个符号链接,该链接指向物理层次结构中的设备目录。
设备的目录在类的目录中创建。在该目录中创建一个符号链接,该符号链接指向设备在sysfs树中的物理位置。
可以在设备的物理目录中创建到其类目录或类顶级目录的符号链接(尽管尚未完成)。也可以创建一个指向其驱动程序的目录。

driver_register

添加新驱动程序的过程几乎相同。遍历总线的设备列表以找到匹配项。已有驱动程序的设备将被跳过。迭代所有设备,以将尽可能多的设备绑定到驱动程序。

Removal

删除设备后,该设备的引用计数最终将变为0。删除设备时,将调用驱动程序的remove回调。它已从驱动程序的设备列表中删除,并且驱动程序的参考计数递减。两者之间的所有符号链接均被删除。
删除驱动程序后,将循环访问其支持的设备列表,并为每个驱动程序调用该驱动程序的remove回调。该设备将从该列表中删除,并且符号链接也已删除。