<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 牛人業(yè)話(huà) > 總線(xiàn),設備,和驅動(dòng)的關(guān)聯(lián)

總線(xiàn),設備,和驅動(dòng)的關(guān)聯(lián)

作者: 時(shí)間:2016-12-08 來(lái)源:網(wǎng)絡(luò ) 收藏

  Linux設備模型中三個(gè)很重要的概念就是,設備,.即bus,device,driver,而實(shí)際上內核中也定義了這么一些數據結構,他們是 struct bus_type,struct device,struct device_driver,這三個(gè)重要的數據結構都來(lái)自一個(gè)地方,include/linux/device.h.我們知道有很多種,pci,scsi總線(xiàn),usb 總線(xiàn),所以我們會(huì )看到 Linux 內核代碼中出現pci_bus_type,scsi_bus_type,usb_bus_type,他們都是struct bus_type類(lèi)型的變量.而struct bus_type結構中兩個(gè)非常重要的成員就是 struct kset drivers 和 struct kset devices.kset 和另一個(gè)叫做 kobject正是 Linux Kernel 2.6中設備模型的基本元素,但此處我們卻不愿多講,因為暫時(shí)不用去認識他們.我們的生命中會(huì )遇見(jiàn)許許多多的人和事,但更多的人和事與我們只是擦肩而過(guò),只是我們生命中的過(guò)客而已.在我們人生的電影中,他們也許只有一個(gè)鏡頭,甚至那一個(gè)鏡頭后來(lái)也被剪輯掉了.這里我們只需要知道,drivers 和 devices 的存在,讓struct bus_type與兩個(gè)鏈表聯(lián)系了起來(lái),一個(gè)是 devices 的鏈表,一個(gè)是drivers 的鏈表,也就是說(shuō),知道一條總線(xiàn)所對應的數據結構,就可以找到這條總線(xiàn)所關(guān)聯(lián)的設備有哪些,又有哪些支持這類(lèi)設備的程序.

本文引用地址:http://dyxdggzs.com/article/201612/341310.htm

  而要實(shí)現這些,就要求每次出現一個(gè)設備就要向總線(xiàn)匯報,或者說(shuō)注冊,每次出現一個(gè),也要向總線(xiàn)報,或者說(shuō)注冊.比如系統初始化的時(shí)候,會(huì )掃描連接了哪些設備,并為每一個(gè)設備建立起一個(gè) struct device的變量,每一次有一個(gè)驅動(dòng)程序,就要準備一個(gè) struct device_driver結構的變量.把這些變量統統加入相應的鏈表,device插入devices鏈表,driver插入drivers鏈表. 這樣通過(guò)總線(xiàn)就能找到每一個(gè)設備,每一個(gè)驅動(dòng).

  然而,假如計算機里只有設備卻沒(méi)有對應的驅動(dòng),那么設備無(wú)法工作.反過(guò)來(lái),倘若只有驅動(dòng)卻沒(méi)有設備,驅動(dòng)也起不了任何作用.在他們遇見(jiàn)彼此之前,雙方都如同路埂的野草,一個(gè)飄啊飄,一個(gè)搖啊搖,誰(shuí)也不知道未來(lái)在哪里,只能在生命的風(fēng)里飄搖.于是總線(xiàn)上的兩張表里就慢慢的就掛上了那許多孤單的靈魂.devices 開(kāi)始多了,drivers 開(kāi)始多了,他們像是兩個(gè)來(lái)自世界,devices 們彼此取暖,drivers 們一起狂歡,但他們有一點(diǎn)是相同的,都只是在等待屬于自己的那個(gè)另一半.

  看代碼的我,一直好奇的想知道,他們是否和我們現實(shí)中一樣,有些人注定是等別人,而有些人是注定被人等的.

  struct bus_type中為 devices 和 drivers 準備了兩個(gè)鏈表,而代表 device的結構體struct device中又有兩個(gè)成員,struct bus_type *bus 和struct device_driver *driver,同樣,代表driver 的結構體 struct device_driver同樣有兩個(gè)成員,struct bus_type *bus和 struct list_head devices,struct device和 struct device_driver的定義和 struct bus_type一樣,在 include/linux/device.h 中.憑一種男人的直覺(jué),可以知曉,struct device中的 bus記錄的是這個(gè)設備連在哪條總線(xiàn)上,driver記錄的是這個(gè)設備用的是哪個(gè)驅動(dòng),反過(guò)來(lái),struct device_driver中的bus代表的也是這個(gè)驅動(dòng)屬于哪條總線(xiàn),devices記錄的是這個(gè)驅動(dòng)支持的那些設備,沒(méi)錯,是devices(復數),而不是device(單數),因為一個(gè)驅動(dòng)程序可以支持一個(gè)或多個(gè)設備,反過(guò)來(lái)一個(gè)設備則只會(huì )綁定給一個(gè)驅動(dòng)程序.

  于是我們想知道,關(guān)于 bus,關(guān)于 device,關(guān)于 driver,他們是如何建立聯(lián)系的呢?換言之,這三個(gè)數據結構中的指針是如何被賦值的?絕對不可能發(fā)生的事情是,一旦為一條總線(xiàn)申請了一個(gè)struct bus_type的數據結構之后,它就知道它的devices鏈表和drivers鏈表會(huì )包含哪些東西,這些咚咚一定不會(huì )是先天就有的,只能是后天填進(jìn)來(lái)的.而具體到usb 系統,完成這個(gè)工作的就是usb core.usb core的代碼會(huì )進(jìn)行整個(gè) usb 系統的初始化,比如申請struct bus_type usb_bus_type,然后會(huì )掃描 usb 總線(xiàn),看線(xiàn)上連接了哪些usb設備,或者說(shuō) root hub上連了哪些usb設備,比如說(shuō)連了一個(gè)usb鍵盤(pán),那么就為它準備一個(gè)struct device,根據它的實(shí)際情況,為這個(gè)struct device賦值,并插入devices鏈表中來(lái).又比如root hub上連了一個(gè)普通的hub,那么除了要為這個(gè)hub 本身準備一個(gè) struct device以外,還得繼續掃描看這個(gè) hub上是否又連了別的設備,有的話(huà)繼續重復之前的事情,這樣一直進(jìn)行下去,直到完成整個(gè)掃描,最終就把

  usb_bus_type中的 devices鏈表給建立了起來(lái). 那么 drivers鏈表呢?這個(gè)就不用bus方面主動(dòng)了,而該由每一個(gè) driver 本身去 bus上面登記,或者說(shuō)掛牌。

  bus上的兩張鏈表記錄了每一個(gè)device和driver,那么device和driver這兩者之間又是如何聯(lián)系起來(lái)的

  呢?此刻,必須拋出這樣一個(gè)問(wèn)題,先有device還是 driver?

  很久很久以前,在那激情燃燒的歲月里,先有的是device,每一個(gè)要用的device在計算機啟動(dòng)之前就已經(jīng)插

  好了,插放在它應該在的位置上,然后計算機啟動(dòng),然后操作系統開(kāi)始初始化,總線(xiàn)開(kāi)始掃描設備,每找到一個(gè)設備,就為其申請一個(gè)struct device結構,并且掛入總線(xiàn)中的devices鏈表中來(lái),然后每一個(gè)驅動(dòng)程序開(kāi)始初始化,開(kāi)始注冊其struct device_driver結構,然后它去總線(xiàn)的devices鏈表中去尋找(遍歷),去尋找每一個(gè)還沒(méi)有綁定driver的設備,即struct device中的struct device_driver指針仍為空的設備,然后它會(huì )去觀(guān)察這種設備的特征,看是否是他所支持的設備,如果是,那么調用一個(gè)叫做device_bind_driver的函數,然后他們就結為了秦晉之好.換句話(huà)說(shuō),把struct device中的struct device_driver driver指向這個(gè)driver,而struct device_driver driver把struct device加入他的那張struct list_headdevices鏈表中來(lái).就這樣,bus,device,和driver,這三者之間或者說(shuō)他們中的兩兩之間,就給聯(lián)系上了.知道其中之一,就能找到另外兩個(gè).一榮俱榮,一損俱損.

  但現在情況變了,在這紅蓮綻放的日子里,在這櫻花傷逝的日子里,出現了一種新的名詞,叫熱插拔.device

  可以在計算機啟動(dòng)以后在插入或者拔出計算機了.因此,很難再說(shuō)是先有device還是先有driver了.因為都有可能.device可以在任何時(shí)刻出現,而driver也可以在任何時(shí)刻被加載,所以,出現的情況就是,每當一個(gè)

  struct device誕生,它就會(huì )去bus 的drivers鏈表中尋找自己的另一半,反之,每當一個(gè)一個(gè)struct

  device_driver誕生,它就去bus的devices鏈表中尋找它的那些設備.如果找到了合適的,那么ok,和之前

  那種情況一下,調用device_bind_driver綁定好.如果找不到,沒(méi)有關(guān)系,等待吧,等到曇花再開(kāi),等到風(fēng)景看

  透,心中相信,這世界上總有一個(gè)人是你所等的,只是還沒(méi)有遇到而已.



關(guān)鍵詞: 總線(xiàn) 驅動(dòng)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>