子曰:按套路出牌。的確,什麼東西都有套路,泡妞有泡妞的套路,花前月下不如花錢日下。打麻將有打麻將的套路,少吃少碰少放炮,多摸多槓多發財。星際有星際的套路,linux也有linux的套路。劉濤姐姐的故事再一次告訴我們,年齡不是問題,身高不是距離,有cai就行。
我們不妨看看 modprobe ehci-hcd 之後發生了什麼事情。ehci-hcd是乙個驅動程式,不知您記不記得我在sysfs中談論過裝置模型。有兩個重要的鍊錶掛在bus上,乙個是裝置device鍊錶,乙個是驅動driver鍊錶。
每當我們向一根bus註冊乙個驅動driver時,套路是這樣的:
driver_register(struct device_driver * drv) -> bus_add_driver() -> driver_attach() ->
bus_for_each_dev(drv->bus, null, drv, __driver_attach);
bus_for_each_dev遍歷該匯流排上所有的device,執行一次__driver_attach(),看能不能將驅動關聯(attach)到某個裝置上去。
__driver_attach()
->driver_probe_device()
->drv->bus->match(dev, drv), // 呼叫bus的match函式,看device和driver匹不匹配。如果匹配上,
繼續執行really_probe()。
->really_probe()
->driver->probe()。(如果bus->probe非空,則呼叫bus->probe)
而每當我們向一根bus新增乙個硬體時時,套路是這樣的:
device_add()
// device_add 中有很多操作kobject,註冊sysfs,形成硬體hiberarchy結構的**。
如果您忘記了,先回頭去參考參考"我是sysfs"
->bus_attach_device() -> device_attach() ->bus_for_each_drv()
bus_for_each_drv與bus_for_each_dev類似,遍歷該匯流排上所有的driver,執行一次__device_attach(),看能不能將裝置關聯(attach)到某個已登記的驅動上去。
__device_attach()
->driver_probe_device() //後面與上面一樣
總結一些,一句話,註冊乙個某個bus的驅動就是先把驅動自己鏈入到bus驅動鏈表中去,在從bus的裝置鍊錶中一一尋找,看有沒有自己可以關聯上的裝置。找到就probe,再把二者bind起來。反之,新增裝置道理也是一樣的。
好吧,我們還是看看modprobe ehci-hcd後的事情。一切從此開始,
module_init(ehci_hcd_init);
我們把不必要的預編譯**去掉後,ehci_hcd_init 如下:
int__initehci_hcd_init(
void
)...
if(retval
<0)
...pci_driver是乙個巨集,#definepci_driverehci_pci_driver。
struct
pci_driverehci_pci_driver
=...
;ehci_hcd_init 很簡單就是呼叫了pci_register_driver(),就是__pci_register_driver()。
int__pci_register_driver(
struct
pci_driver
*drv,
struct
module
*owner,
const
char
*mod_name)
...
driver_register(struct device_driver * drv)就是前面講過了,就是linux的套路。那我們看看pci匯流排的match, probe函式是什麼樣的吧。
Linux那些事兒之我是EHCI 引子
轉眼之間,到了2008年,先祝大家新年快樂,希望新的一年裡好運連連,工資猛漲。好久沒有寫了,乙個原因在於,作 為乙個phd學生,難免要做一些讀 寫 的瑣事,另乙個原因就是自己太懶了。大哥甲一如既往,堅持的寫作,著實讓人欽佩。此時此刻,我情 不自禁,作詩一首,北飄奇男子,江南大丈夫。海上常常生明月,江...
Linux那些事兒之我是EHCI 引子
轉眼之間,到了2008年,先祝大家新年快樂,希望新的一年裡好運連連,工資猛漲。好久沒有寫了,乙個原因在於,作為乙個phd學生,難免要做一些讀 寫 的瑣事,另乙個原因就是自己太懶了。大哥甲一如既往,堅持的寫作,著實讓人欽佩。此時此刻,我情不自禁,作詩一首,北飄奇男子,江南大丈夫。海上常常生明月,江湖就...
《Linux那些事兒之我是PCI》筆記
核心版本 2.6.22 1.pci access mode bios,direct,mmconfig,any。bios mode 有的bios程式提供了針對pci匯流排的操作,這些操作包括匯流排列舉,此種bios稱為pci bios 此種方式直接使用bios程式列舉的結果。64位平台沒有該選項 di...