Linux 裝置模型中三個很重要的概念就是匯流排、裝置和驅動,即 bus 、 device 和 driver 。而實際上核心中也定義了這麼一些資料結構,他們是 struct bus_type , struct device , struct device_driver ,這三個重要的資料結構都來自同一個地方,稱 include/linux/device.h 。
我們知道匯流排有很多種,如 PCI 匯流排、 SCSI 匯流排、 USB 匯流排,所以我們會看到 Linux 核心代碼中出現pci_bus_type , scsi_bus_type , usb_bus_type ,它們都是 struct bus_type 類型的變數。而 struct bus_type結構中兩個非常重要的成員就是 struct kset drivers 和 struct kset devices 。 kset 和另一個叫做 kobject 正是 2.6核心中裝置模型的基本元素。
這裡我們只需要知道, drivers 和 devices 的存在,讓 struct bus_type 與兩個鏈表聯絡了起來,一個是 devices的鏈表,一個是 drivers 的鏈表。也就是說,知道一條匯流排所對應的資料結構,就可以找到這條匯流排所關聯的裝置,及支援這類裝置的驅動程式。
而要實現這些目的,就要求每次出現一個裝置就要向匯流排彙報,或者說註冊。每次出現一個驅動,也要向匯流排彙報,或者註冊。比如系統初始化 時 ,會掃描串連了哪些裝置,並為每一個裝置建立起一個 struct device 的變數,每一次有一個驅動程式,就要準備一個 struct device_driver 結構的變數。把這些變數統統加入相應的鏈表,裝置 插入 devices 鏈表, 驅動 插入 drivers 鏈表。 這樣通過匯流排就能找到每一個裝置,每一個驅動。
然而,假如電腦裡只有裝置卻沒有對應的驅動,那麼裝置無法工作。反過來,倘若只有驅動卻沒有裝置,驅動也起不了任何作用。 裝置 開始多了, 驅動 開始多了,它們像是兩個來自世界, 裝置 們彼此取暖, 驅動 們一起狂歡,但它們有一點是相同的,都只是在等待屬於自己的那個另一半。