《Linux那些事儿之我是USB》我是U盘(9)总线,设备和驱动(下)--总结

(1)
bus上的两张链表记录了每一个device和driver,那么device和driver这两者之间又是如何联系起来的呢?

很久很久以前,先有的是device,每一个要用的device在计算机启动之前就已经插好了,插放在它应该在的位置上,然后计算机启动,然后操作系统开始初始化,总线开始扫描设备,每找到一个设备,就为其申请一个struct device结构,并且挂入总线中的devices链表中来,然后每一个驱动程序开始初始化,开始注册其struct device_driver结构,然后它去总线的devices链表中去寻找(遍历),去寻找每一个还没有绑定driver的设备,即struct device中的struct device_driver指针仍为空的设备,然后它会去观察这种设备的特征,看是否是他所支持的设备,如果是,那么调用一个叫做device_bind_driver的函数,然后他们就结为了秦晋之好.换句话说,把struct device中的struct device_driver driver指向这个driver,而struct device_driver driver把struct device加入他的那张struct list_head devices链表中来.就这样,bus,device,和driver,这三者之间或者说他们中的两两之间,就给联系上了.

int device_bind_driver(struct device *dev)--->driver_bound()
static void driver_bound(struct device *dev)
{
klist_add_tail(&dev->p->knode_driver, &dev->driver->p->klist_devices);
}

device_bind_driver()将device与driver绑定。它调用了两个内部函数。
其中drivers_sysfs_add()负责创建sysfs中driver和device指向对方的软链接。还有一个与它相对的函数drivers_sysfs_remove()。
driver_bound()则实际将device加入驱动的设备链表。因为在调用device_bind_driver()之前就已经设置过dev->driver了,所以这样就将device和driver绑定了。

(2)
热插拔的出现:
device可以在计算机启动以后在插入或者拔出计算机了.很难再说是先有device还是先有driver了.因为都有可能.device可以在任何时刻出现,而driver也可以在任何时刻被加载,每当一个struct device诞生,它就会去bus的drivers链表中寻找自己的另一半,反之,每当一个一个struct device_driver诞生,它就去bus的devices链表中寻找它的那些设备.如果找到了合适的,调用device_bind_driver绑定好.如果找不到,没有关系,等待吧。

猜你喜欢

转载自blog.csdn.net/sinat_37817094/article/details/80355555