转载:https://blog.csdn.net/tangtang_yue/article/details/51036598
kobject,kset是设备模型的基本结构体,设备模型使用这两个结构体来过程设备的层次关系,但在实际的设备驱动编写中,我们基本用不到kobject,kset这些结构体,是因为这些结构体又被嵌入到更大的结构体如bus,drivers,devices中,原因在于kobject,kset结构体只能表征设备的层次关系,但是一个设备的驱动,并不是简单的一个层次关系而已,因此,必须把kobject,kset结构体嵌入到更大的结构体中,使用kobject,kset来表征层次关系,用其他的成员表示设备驱动的具体功能。
在设备模型中,我们将看到,设备驱动注意是由总线,驱动程序,设备三个部分构成,通过这三个标准部件,把各种纷繁杂乱的设备鬼节过来,达到简化设备驱动编写的目的,也即我们编写的设备驱动,起始也只是这三部分的一个很小的部分。
我们编写的设备驱动程序,一定是先属于一个总线的驱动,比如usb总线,PCI总线,IC总线等等。因为我们编写的设备驱动,在注册,安装到系统时,系统会先检查驱动是属于哪个总线的(设备驱动编写时已经定义好),会把驱动加入到对应的总线的kset中,即把当前设备驱动的kobject加入到对应总线的kset中,形成层次关联。而当系统检测到有设备存在(硬件),也会先判断设备是属于哪个总线的(硬件连接),然后遍历当前总线下的所有设备驱动程序,通过所属总线的探测函数,查找时候有设备驱动程序匹配可以驱动当前的设备 (一般是通过获得设备的PID,VID,跟驱动程序的PID,VID比较,看是否匹配而定), 如果有驱动程序可以驱动设备,则把当前设备也加入到所属总线的kset中,如果没有可驱动设备的驱动程序,则只能在总线的设备链表中存在,而如果设备都无法通过总线的匹配,则也没有办法存在于总线的设备链表中。
由于一条总线要管理总线上的所有驱动,同时要管理总线上的所有设备,则需要把所有设备和所有驱动都分开,分别设立一个设备kset和一个设备驱动kset,用于管理总线上的所有设备和设备驱动,如此,则总线kset实际上包含了两个kset(设备kset,设备驱动kset),设备kset又包含了所有的当前总线的设备的kobject,设备驱动kset又包含了所有的当前总线的设备驱动的的kobject,而所有的总线,又形成了bus的kset。
每个设备,被挂接到不同的总线上(此时所对应的总线类型就确定了):
》设备被挂接到总线上时,总线要先扫描硬件设备,看设备是否符合总线设备的要求,
》》如果符合,接着扫描整个总线上的设备驱动链表,查找是否有设备驱动程序可以管理设备
》》》如果找到,则把设备结构体中的指向驱动程序的指针指向对应的驱动程序,
》》》如果没有,则把设备结构体中的指向驱动程序的指针设置为NULL,表示还没有设备驱动,还在总线的设备队列中等待。
》》如果不符合,自然就不会出现在总线的设备列表上,自然不会去扫描设备驱动链表,查找匹配的驱动。
每个设备驱动程序,都是被手动/自动安装到对应的总线上的。
》所谓安装,就是把驱动程序挂载到对应总线的驱动链表中
》》如果要挂载,先要满足总线的匹配要求,才能挂载到总线的驱动链表中
》》》挂载成功之后,系统才能通过扫描整个总线的设备链表,来查找时候有设备需要此驱动来管理
》》》》如果找到这个设备,则驱动程序中的设备管理链表,会记录这个设备的地址,从而达到管理设备的目的
两种情况
》只有驱动,没有设备
》只有设备,没有对应驱动
此时,设备或者驱动就会暂时在各自的队列里等待,一旦有驱动程序安装,或者新设备插入,就会自动去扫描对应的链表,来检查是否有配对的可能。