進一步理解!linux下bus,device,driver三者關係
1.bus:
匯流排作為主機和外設的連線通道,有些匯流排是比較規範的,形成了很多協議。如PCI,USB,1394,IIC等。任何裝置都可以選擇合適的匯流排連線到主機。當然主機也可能就是CPU本身。記憶體也是通過BUS連線到主機的,可記憶體使用的匯流排不是外設匯流排,因此和記憶體使用相同型別的匯流排的裝置,談及BUS比較含糊。
一塊網路卡在嵌入式開發中,直接通過記憶體匯流排接入到CPU。我們在寫網路卡驅動時,要給該BUS定義就麻煩了。
2.driver:
驅動程式是在CPU執行時,提供操作的軟體介面。所有的裝置必須有與之配套驅動程式才能正常工作。一個驅動程式可以驅動多個類似或者完全不同的裝置。
3.device:
裝置就是連線在匯流排上的物理實體。裝置是有功能之分的。具有相同功能的裝置被歸到一個類(CLASS中)。如音訊裝置(和聲音相關的都算),輸入裝置(滑鼠,鍵盤,遊戲杆等)。
從巨集觀考慮,任何裝置必須要連線到主機才能發揮其作用。一個滑鼠離開了電腦主機就不再是滑鼠了。提到了連線就必然出現匯流排BUS。任何裝置要正常執行必須有軟體支援,所有的裝置必須有DRIVER。裝置的目的就是完成功能,根據功能的分類,該裝置必然屬於某個CLASS。
1.三者的定義在 include/Linux/device.h裡。
2.匯流排中的那兩條連結串列是怎麼形成:
這要求每次出現一個裝置就要向匯流排彙報,或者說註冊,每次出現一個驅動,也要向匯流排彙報,或者說註冊。比如系統初始化的時候,會掃描連線了哪些裝置,併為每一個裝置建立起一個struct device的變數,每一次有一個驅動程式,就要準備一個struct device_driver結構的變數。把這些變數統統加入相應的連結串列,device 插入devices 連結串列,driver插入drivers連結串列。這樣通過匯流排就能找到每一個裝置,每一個驅動.然而,假如計算機裡只有裝置卻沒有對應的驅動,那麼裝置無法工作。反過來,倘若只有驅動卻沒有裝置,驅動也起不了任何作用。
3.匯流排上的兩條連結串列已經有了,連結串列裡的device和driver又是如何聯絡
每一個要用的device在計算機啟動之前就已經插好了,插放在它應該在的位置上,然後計算機啟動,然後作業系統開始初始化,匯流排開始掃描裝置,每找到一個裝置,就為其申請一個struct device結構,並且掛入匯流排中的devices連結串列中來;
然後每一個驅動程式開始初始化,開始註冊其struct device_driver結構,然後它去匯流排的devices連結串列中去尋找(遍歷),去尋找每一個還沒有繫結driver的裝置,即struct device中的struct device_driver指標仍為空的裝置,然後它會去觀察這種裝置的特徵,看是否是他所支援的裝置,如果是,那麼呼叫一個叫做 device_bind_driver的函式。換句話說,把struct device中的struct device_driver driver指向這個driver,而struct device_driver driver把struct device加入他的那張struct klist klist_devices連結串列中來。就這樣,bus、device和driver,這三者之間或者說他們中的兩兩之間,就給聯絡上了
4.熱插拔:
device可以在計算機啟動以後在插入或者拔出計算機了。因此,很難再說是先有 device還是先有driver了。因為都有可能。device可以在任何時刻出現,而driver 也可以在任何時刻被載入,所以,出現的情況就是,每當一個struct device誕生,它就會去bus的drivers連結串列中尋找自己的另一半,反之,每當一個一個struct device_driver誕生,它就去bus的devices連結串列中尋找它的那些裝置。如果找到了合適的,那麼ok,和之前那種情況一下,呼叫 device_bind_driver繫結好.
相關文章
- [Linux Device Driver] wifi adb 使用方法LinuxdevWiFi
- linux下asm裡如何找到asm disk和os device的對應關係LinuxASMdev
- SciTech-OS-Linux-Device Driver: 英文原版電子書“Linux Device Drivers, Third Edition”Linuxdev
- jdk、jre、jvm三者關係JDKJVM
- Linux的匯流排-裝置-驅動三者之間的關係和框架的理解Linux框架
- JVM、JDK、JRE三者的關係JVMJDK
- Audio device on High definition Audio busdev
- 底層剖析 Window 、Activity、 View 三者關係View
- setup與data、methods三者間的關係
- 正確理解 AsyncTask,Looper,Handler三者之間的關係(基於android 4.0)OOPAndroid
- 關於 一合相 的再進一步的理解。
- VMware公司希望通過合作關係進一步提升業務態勢
- MySQL表關係的理解MySql
- 一文看懂IP、UDP和TCP三者的關係UDPTCP
- [java基礎]之JVM/JRE/JDK三者的關係JavaJVMJDK
- oracle 叢集,資料庫,asm三者關係認證表Oracle資料庫ASM
- 如何理解CRM客戶關係?
- Linux程式關係Linux
- 理解 virt、res、shr 之間的關係(linux 系統篇)Linux
- 理解virt、res、shr之間的關係(linux系統篇)Linux
- tep環境變數、fixtures、用例三者之間的關係變數
- 關係型資料庫的理解資料庫
- 有關resetlogs和incarnation關係的理解
- linux下SCP無密碼傳輸(建立互信關係)Linux密碼
- Docker——理解好映象和容器的關係Docker
- 深入理解PCA與SVD的關係PCA
- 理解JavaScript中BOM和DOM的關係JavaScript
- 對Node.js非同步的進一步理解Node.js非同步
- 火必與波場Poloniex達成戰略合作伙伴關係 進一步推進全球化戰略
- linux下如何使用raw device來建立管理asm diskLinuxdevASM
- 如何理解客戶關係管理CRM系統?
- 如何理解Nginx, WSGI, Flask之間的關係NginxFlask
- 我所理解的OOP——UML六種關係OOP
- linux下查詢asm磁碟和linux的分割槽的對應關係LinuxASM
- 一步一步理解命令模式模式
- 2大型別的裝置驅動程式(2 main types of device driver)型別AIdev
- 使用python一步完成相關係數計算(correlation coefficient)Python
- selenium driver 下載地址