原文:
kobject,kset是裝置模型的基本結構體,裝置模型使用這兩個結構體來完成裝置的層次關係,但在實際的裝置驅動編寫中,我們基本上用不到kobject,kset這些結構體,是因為這些結構體又被嵌入到更大的結構體中,原因在於kobject,kset結構體只能表徵裝置的層次關係,但是乙個裝置的驅動,並不是簡單的乙個層次關係而已,因此,必需要把kobject,kset結構體嵌入到更大的結構體中,使用kobject,kset來表徵層次關係,用其他的成員表示裝置驅動的具體功能。
在裝置模型中,我們將看到,裝置驅動主要是由匯流排,驅動程式,裝置三個部分構成,通過這三個標準部件,把各種紛繁雜亂的裝置歸結過來,達到簡化裝置驅動編寫的目的,也即我們編寫的裝置驅動,其實也只是這三部分中的乙個很小的部分的。
我們編寫的裝置驅動程式,一定是先屬於乙個匯流排的驅動,比如屬於usb匯流排,或者屬於pci匯流排,或者屬於i2c匯流排,等等,因為我們編寫的裝置驅動,在註冊,安裝到系統時,系統會先檢查驅動是屬於哪個匯流排的(裝置驅動編寫時已經定義好),會把驅動加入到對應的匯流排的kset中,即把當前裝置驅動的kobject加入到對應匯流排的kset中,形成層次關聯。而當系統檢測到有裝置存在(硬體),也會先判斷裝置是屬於哪個匯流排的(硬體連線),然後遍歷當前匯流排下的所有裝置驅動程式,通過所屬匯流排的探測函式,查詢是否有裝置驅動程式匹配可以驅動當前的裝置(一般是通過獲得裝置的pid,vid,跟驅動程式的pid,vid比較,看是否匹配而定),如果有驅動程式可以驅動裝置,則把當前裝置也加入到所屬匯流排的kset中,如果沒有可驅動裝置的驅動程式,則只能在匯流排的裝置鍊錶中存在,而如果裝置都無法通過匯流排的匹配,則也沒有辦法存在於匯流排的裝置鍊錶中。由於一條匯流排要管理匯流排上的所有驅動,同時要管理匯流排上的有所裝置,則需要再把所有裝置和所有驅動都分開,分別設立乙個裝置kset和乙個裝置驅動kset,用於管理所有的裝置和裝置驅動,如此,則匯流排kset實際上包含了兩個kset(裝置kset,裝置驅動kset),裝置kset又包含了所有的當前匯流排的裝置的kobject,裝置驅動kset包含了所有的當前匯流排的裝置驅動的kobject;而所有的匯流排,又形成了bus的kset,歸結起來就形成下圖的層次關係:
每個裝置,都被掛接到不同的匯流排上,當裝置掛接到對應的匯流排上後,其所對應的匯流排型別就確定了,而裝置在掛接到匯流排上時,匯流排先要掃瞄裝置,看看裝置是否適合匯流排的要求,如果適合了,那接著就要掃瞄整個匯流排上的裝置驅動鏈表,查詢是否有驅動程式可以管理裝置,如果找到,則把裝置結構體中的相應指標成員指向對應的驅動程式,如果暫時沒有找到對應的裝置驅動程式,則裝置結構體中的指向驅動程式的指標暫時為空,表示還沒有裝置驅動,還在匯流排的裝置佇列中等待;而如果裝置不能通過匯流排的檢查,即不會出現在匯流排的裝置列表上,自然不會去掃瞄裝置驅動鏈表,查詢匹配的驅動了。
而每個裝置驅動程式,都是被安裝到對應的匯流排上的,不論是手動安裝,還是自動安裝,所謂安裝,就是把驅動程式掛載到對應匯流排的驅動鏈表中,而掛載到對應的匯流排驅動鏈表,首先要滿足匯流排的匹配要求,只有適合了要求,才能掛載到匯流排的驅動鏈表,也只有到達這個步驟,系統才會掃瞄整個匯流排的裝置鍊錶,來查詢是否有裝置需要此驅動來管理,如果找到這個裝置,則驅動程式中的裝置管理鍊錶,會記錄這個裝置的位址,從而達到管理裝置的目的。
經過上述的裝置插入,或者驅動安裝,系統就會出現只有裝置,而沒有裝置驅動程式的情況,也會出現,只有裝置驅動程式,沒有對應的裝置的情況,此時,裝置或者裝置驅動程式,就會暫時在各自的佇列裡等待,一旦有驅動程式安裝,或新的裝置插入,就都會自動的去掃瞄對應的鍊錶,來檢測是否有配對的可能。
綜合上述三者的關係,如圖:
裝置驅動基礎1 裝置模型之匯流排,驅動,裝置
kobject,kset是裝置模型的基本結構體,裝置模型使用這兩個結構體來完成裝置的層次關係,但在實際的裝置驅動編寫中,我們基本上用不到kobject,kset這些結構體,是因為這些結構體又被嵌入到更大的結構體中,原因在於kobject,kset結構體只能表徵裝置的層次關係,但是乙個裝置的驅動,並不...
匯流排 裝置 驅動模型
裝置元素 匯流排,驅動,裝置 匯流排 處理器和裝置之間的通道,在裝置模型中,所有的裝置都通過匯流排相連,甚至是內部的虛擬 platform 匯流排 定時器,看門狗並沒有直接相連 在linux裝置模型中,匯流排由bus type結構表示,定義在 匯流排的註冊使用 bus register struct...
匯流排裝置驅動模型
匯流排裝置驅動模型 匯流排是主機和裝置之間的通道,由bus type 結構描述。int bus register struct bus type bus 匯流排的註冊,若成功,新的匯流排將被新增進系統,並可在 sysfs 的 sys bus 下看到。void bus unregister struc...