null 驅動 查找 簡化 class 鏈表 details 等待 tails

轉載: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,表示還沒有設備驅動,還在總線的設備隊列中等待。
》》如果不符合,自然就不會出現在總線的設備列表上,自然不會去掃描設備驅動鏈表,查找匹配的驅動。
每個設備驅動程序,都是被手動/自動安裝到對應的總線上的。
》所謂安裝,就是把驅動程序掛載到對應總線的驅動鏈表中
》》如果要掛載,先要滿足總線的匹配要求,才能掛載到總線的驅動鏈表中
》》》掛載成功之後,系統才能通過掃描整個總線的設備鏈表,來查找時候有設備需要此驅動來管理
》》》》如果找到這個設備,則驅動程序中的設備管理鏈表,會記錄這個設備的地址,從而達到管理設備的目的

兩種情況
》只有驅動,沒有設備
》只有設備,沒有對應驅動
此時,設備或者驅動就會暫時在各自的隊列裏等待,一旦有驅動程序安裝,或者新設備插入,就會自動去掃描對應的鏈表,來檢查是否有配對的可能。

https://blog.csdn.net/tangtang_yue/article/details/51036598

總線,設備,驅動的關系