linux设备模型
- 设备device,驱动driver,总线bus。
- 设备代表物理设备,驱动代表了设备操作方法,bus则是用来管理和匹配它们。
- device和driver里面都有一个成员变量bus,表示它们归哪个总线管理,bus里面则有两个链表,device链表和driver链表。当有新的设备加入的时候,就会将它加入它对应的bus的device链表,然后在它的驱动链表中寻找是否有驱动driver和该device匹配成功,如果匹配成功设备就可以正常使用了,否则继续等待。当有新的驱动加入的时候,就会将它加入它对应的bus的driver链表,然后在它的设备链表中寻找是否有设备device和该driver匹配成功,如果成功设备就可以正常使用了。
Note:驱动模型中的总线可以是真是存在的物理总线(USB总线,I2C总线,PCI总线),也可以是为了驱动模型架构设计出的虚拟总线(Platform总线)。
device_add
- 会把device代表的结构体放入总线的bus_dev链表中;
- 从bus_drv链表中取出每个drv,用总线的match函数判断drv能否支持该dev;
- 如果能够支持,则调用drv中的probe函数;
driver_register
- 会把driver代表的结构体放入总线的bus_drv链表中;
- 从bus_dev链表中取出每个dev,用总线的match函数判断该drv能否支持取出的dev;
- 如果能够支持,则调用drv中的probe函数。
Note:match函数是根据驱动的名字和设备的名字是否一致来进行判断,如果两者相同,则调用驱动中的probe函数。