《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 業(yè)界動態(tài) > 總線,設(shè)備,和驅(qū)動的關(guān)聯(lián)

總線,設(shè)備,和驅(qū)動的關(guān)聯(lián)

2017-07-13

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

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

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

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

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

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

  usb_bus_type中的 devices鏈表給建立了起來. 那么 drivers鏈表呢?這個就不用bus方面主動了,而該由每一個 driver 本身去 bus上面登記,或者說掛牌。

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

  呢?此刻,必須拋出這樣一個問題,先有device還是 driver?

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

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

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

  可以在計(jì)算機(jī)啟動以后在插入或者拔出計(jì)算機(jī)了.因此,很難再說是先有device還是先有driver了.因?yàn)槎加锌赡?device可以在任何時刻出現(xiàn),而driver也可以在任何時刻被加載,所以,出現(xiàn)的情況就是,每當(dāng)一個

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

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

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

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


本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
一区久久精品| 亚洲网站在线看| 国产精品久久777777毛茸茸| 欧美大片在线观看一区二区| 久久久久久噜噜噜久久久精品| 先锋影音一区二区三区| 亚洲愉拍自拍另类高清精品| 亚洲天堂偷拍| 亚洲一区二区3| 亚洲一区二区三区午夜| 亚洲一品av免费观看| 一区二区三区视频在线看| 日韩亚洲一区在线播放| 亚洲精品三级| 最新国产成人av网站网址麻豆| 亚洲激情综合| 亚洲精品国产精品国产自| 91久久视频| 亚洲精品美女久久7777777| 亚洲黄网站在线观看| 亚洲欧洲视频在线| 亚洲精品一品区二品区三品区| 亚洲日本欧美| 一本到12不卡视频在线dvd| 一区二区冒白浆视频| 在线综合亚洲欧美在线视频| 亚洲小说春色综合另类电影| 亚洲男人av电影| 午夜精品亚洲一区二区三区嫩草| 性做久久久久久| 久久gogo国模裸体人体| 久久久久五月天| 美女成人午夜| 欧美精品自拍偷拍动漫精品| 欧美日韩视频一区二区三区| 国产精品免费视频观看| 国产视频在线一区二区| 娇妻被交换粗又大又硬视频欧美| 亚洲福利视频网| 日韩午夜中文字幕| 亚洲一区在线免费观看| 久久xxxx| 99re亚洲国产精品| 亚洲欧美成人一区二区三区| 欧美一区精品| 欧美aa在线视频| 欧美日韩亚洲在线| 国产伦精品一区二区三区照片91| 狠狠色香婷婷久久亚洲精品| 亚洲精品日本| 午夜亚洲激情| 91久久精品美女高潮| 亚洲一区二区三区四区五区黄 | 久久久av毛片精品| 欧美激情视频在线播放| 国产精品免费福利| 激情成人亚洲| 宅男噜噜噜66一区二区| 亚洲电影在线| 亚洲午夜久久久久久久久电影网| 久久国产精品99国产| 欧美激情视频在线播放| 国产麻豆综合| 亚洲九九精品| 久久精品二区三区| 亚洲一区二区三区777| 久久久噜噜噜久久狠狠50岁| 欧美日本国产在线| 国产一级一区二区| 99re6这里只有精品| 久久国产精品一区二区三区四区 | 欧美激情综合五月色丁香小说| 国产精品久久夜| 亚洲高清在线| 性色一区二区| 亚洲一区二区三区精品在线| 六十路精品视频| 国产精品亚洲综合天堂夜夜| 亚洲国产精品一区二区三区| 午夜精品理论片| 在线亚洲免费| 蜜桃av噜噜一区| 欧美与黑人午夜性猛交久久久| 欧美精品网站| 一本大道av伊人久久综合| 久久精品国产欧美亚洲人人爽| 欧美日本在线看| 欧美黄色小视频| 欧美一区二区三区视频免费播放| 久久se精品一区二区| 亚洲国产欧美一区二区三区丁香婷| 亚洲小视频在线观看| 9色精品在线| 影音先锋另类| 国产精品高潮呻吟久久av无限| 久久精品网址| 亚洲国产导航| 欧美一级播放| 欧美三级午夜理伦三级中视频| 激情五月***国产精品| 午夜久久美女| 亚洲女同精品视频| 欧美日韩视频不卡| 亚洲日本久久| 亚洲激情在线观看视频免费| 久久久久免费观看| 国产一级精品aaaaa看| 午夜日韩av| 欧美一区免费视频| 国产伦理精品不卡| 亚洲欧美成人一区二区在线电影| 亚洲一区精品在线| 欧美日韩综合精品| 日韩一二在线观看| 这里只有精品视频| 亚洲国产成人在线播放| 国产精品久久久久高潮| 国产日韩精品久久| 亚洲女女女同性video| 亚洲中午字幕| 国产精品分类| 一区二区三区国产在线| 中国成人亚色综合网站| 欧美日韩国产三区| 99精品久久久| 亚洲综合不卡| 国产精品夜色7777狼人| 亚洲主播在线观看| 性色av一区二区怡红| 国产精品一级二级三级| 亚洲欧美国产精品桃花| 欧美一区成人| 韩国av一区二区三区四区| 久久精品一区二区| 欧美sm视频| 亚洲精品久久久久久一区二区| 日韩亚洲欧美一区| 欧美日韩在线精品一区二区三区| 一本大道久久精品懂色aⅴ| 亚洲综合国产激情另类一区| 国产精品日韩精品欧美在线| 小处雏高清一区二区三区| 久久亚洲一区二区三区四区| 精品不卡一区| 99精品国产热久久91蜜凸| 欧美日韩一区不卡| 亚洲欧美日韩中文在线制服| 久久精品99国产精品日本| 黑人中文字幕一区二区三区 | 新片速递亚洲合集欧美合集| 久久久久久噜噜噜久久久精品| 一区福利视频| 一本色道**综合亚洲精品蜜桃冫 | 欧美三级视频| 香蕉久久a毛片| 美女啪啪无遮挡免费久久网站| 亚洲高清在线视频| 一区二区三区四区五区在线| 国产精品中文在线| 亚洲第一精品福利| 亚洲大片免费看| 亚洲精品久久视频| 亚洲一区二区动漫| 国产午夜精品久久久久久免费视| 久久精品系列| 欧美日韩网站| 香蕉成人伊视频在线观看| 亚洲综合成人在线| 国产精品自拍一区| 亚洲深夜福利网站| 久久久久久网址| 亚洲乱码精品一二三四区日韩在线| 亚洲一区二区视频在线| 韩国精品主播一区二区在线观看| 日韩视频在线观看| 国产欧美日韩视频一区二区| 91久久精品国产91久久性色| 欧美系列精品| 亚洲国产欧美国产综合一区 | 亚洲国产精品t66y| 欧美一区二区免费| 亚洲国产欧美日韩另类综合| 欧美亚洲一区| 亚洲人成网站在线播| 欧美一区91| 亚洲精品视频免费| 久久婷婷蜜乳一本欲蜜臀| 一区二区三欧美| 免费成人av在线看| 午夜伦欧美伦电影理论片| 欧美日韩国产黄| 亚洲国产经典视频| 国产精品一卡二| aa国产精品| 在线观看亚洲视频| 久久国产精品久久久久久| 99国产精品国产精品毛片| 嫩模写真一区二区三区三州| 性色av香蕉一区二区| 国产精品久久二区|