bus, device, driver之間關係

2021-06-08 14:11:38 字數 2749 閱讀 2067

匯流排、裝置、驅動,也就是bus、device、driver,在核心裡都會有它們自己專屬的結構,在include/linux/device.h 裡定義。

首先是匯流排,bus_type.

struct bus_type ;

下面是裝置device的定義:

struct device ;

下面是裝置驅動定義:

struct device_driver ;

我們會發現,

structbus_type

中有成員

structksetdrivers

和structksetdevices,

同時structdevice

中有兩個成員

struct bus_type*bus

和struct device_driver*driver

,structdevice_driver

中有兩個成員

structbus_type*bus

和structklistklist_devices。

structdevice

中的bus

表示這個裝置連到哪個匯流排上,

driver

表示這個裝置的驅動是什麼,

structdevice_driver

中的bus

表示這個驅動屬於哪個匯流排,

klist_devices

表示這個驅動都支援哪些裝置,因為這裡

device

是複數,又是

list

,更因為乙個驅動可以支援多個裝置,而乙個裝置只能繫結乙個驅動。當然,

structbus_type

中的drivers

和devices

分別表示了這個匯流排擁有哪些裝置和哪些驅動。

還有上面

device

和driver

結構裡出現的

kobject

結構是什麼?

kobject

和kset

都是linux

裝置模型中最基本的元素。一般來說應該這麼理解,整個

linux

的裝置模型是乙個

oo 的體系結構,匯流排、裝置和驅動都是其中鮮活存在的物件,

kobject

是它們的基類,所實現的只是一些公共的介面,

kset

是同種型別

kobject

物件的集合,也可以說是物件的容器。

那麼匯流排、裝置和驅動之間是如何關聯的呢?

先說說匯流排中的那兩條鍊錶是怎麼形成的。核心要求每次出現乙個裝置就要向匯流排匯報,或者說註冊,每次出現乙個驅動,也要向匯流排匯報,或者說註冊。比如系統初始化的時候,會掃瞄連線了哪些裝置,並為每乙個裝置建立起乙個

structdevice

的變數,每一次有乙個驅動程式,就要準備乙個

structdevice_driver

結構的變數。把這些變數統統加入相應的鍊錶,

device

插入devices

鍊錶,driver

插入drivers

鍊錶。這樣通過匯流排就能找到每乙個裝置,每乙個驅動。

裝置和驅動又是如何聯絡?

原來是把每乙個要用的裝置在計算機啟動之前就已經插好了,插放在它應該在的位置上,然後計算機啟動,然後作業系統開始初始化,匯流排開始掃瞄裝置,每找到乙個裝置,就為其申請乙個

structdevice

結構,並且掛入匯流排中的

devices

鍊錶中來,然後每乙個驅動程式開始初始化,開始註冊其

struct device_driver

結構,然後它去匯流排的

devices

鍊錶中去尋找(遍歷

),去尋找每乙個還沒有繫結驅動的裝置,

structdevice

中的structdevice_driver

指標仍為空的裝置,然後它會去觀察這種裝置的特徵,看是否是他所支援的裝置,如果是,那麼呼叫乙個叫做

device_bind_driver

的函式,然後他們就結為了**之好。換句話說,把

structdevice

中的structdevice_driverdriver

指向這個驅動,而

struct device_driver driver

把struct device

加入他的那

structklist klist_devices

鍊錶中來。就這樣,

bus、

device

和driver

,這三者之間或者說他們中的兩兩之間,就給聯絡上了。知道其中之一,就能找到另外兩個。

但現在情況變了,出現了一種新的名詞,叫熱插拔。裝置可以在計算機啟動以後在插入或者拔出計算機了。裝置可以在任何時刻出現,而驅動也可以在任何時刻被載入,所以,出現的情況就是,每當乙個

structdevice

誕生,它就會去

bus

的drivers

鍊錶中尋找自己的另一半,反之,每當乙個

struct device_driver

誕生,它就去

bus的

devices

鍊錶中尋找它的那些裝置。如果找到了合適的,那麼

ok,和之前那種情況一下,調

device_bind_driver

繫結好。如果找不到,沒有關係,等待吧!

CGI,FASTcgi,PHP fpm之間的關係

剛開始對這個問題我也挺糾結的,看了 http權威指南 後,感覺清晰了不少。首先,cgi是幹嘛的?cgi是為了保證web server傳遞過來的資料是標準格式的,方便cgi程式的編寫者。web server 比如說nginx 只是內容的分發者。比如,如果請求 index.html,那麼web serv...

配置apache php mysql之間的關係

1 index.php檔案放入 usr local apache2 htdocs 目錄下 其中index.php裡面內容為 phpinfo dbc mysql connect 127.0.0.1 root win2009 if dbc else mysql close dbc2 new mysqli...

usb的endpoint,pipe之間的關係

端點 endpoint 每乙個usb裝置在主機看來就是乙個端點的結合,主機只能通過端點與裝置進行通訊,以使用裝置的功能 每乙個端點實際上就是乙個一定大小的資料緩衝區。管道 pipe 乙個usb管道是驅動程式的乙個資料區緩衝與乙個外設端點的連線,它代表了一種在兩者之間移動資料的能力。一旦裝置被配置,管...