匯流排、裝置、驅動,也就是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管道是驅動程式的乙個資料區緩衝與乙個外設端點的連線,它代表了一種在兩者之間移動資料的能力。一旦裝置被配置,管...