東坡下載:內(nèi)容最豐富最安全的下載站!

首頁IT技術(shù)操作系統(tǒng) → 讀Linux那些事兒之我是HUB筆記

讀Linux那些事兒之我是HUB筆記

相關(guān)文章發(fā)表評論 來源:本站時(shí)間:2011/4/28 13:32:46字體大小:A-A+

更多

作者:點(diǎn)擊:276次評論:0次標(biāo)簽:

1、 usb設(shè)備能夠使用條件:一個(gè)是 usbcore,這就是核心模塊,另一個(gè)是主機(jī)控制器的驅(qū)動(dòng)程序
usb host controller.一個(gè)是 echi的,三個(gè)是uhci,就是host controller 的接口;
hub:叫做集線器(設(shè)備與host control)
2、 root hub:
Root Hub 上可以連接別的設(shè)備,可以連接 U 盤,可以連接usb 鼠標(biāo),同樣也可以連接另一個(gè) hub.所謂 hub,就是用來級連;
通常做芯片的同志們會(huì)把 Host Controller 和 Root Hub 集成在一起.特別是 PC 主機(jī)上,通常你就只能看到接口,看不到 Root Hub
subsys_initcall(usb_init)的意思就是告訴我們 usb_init 是我們真正的初始化函數(shù),而 usb_exit()將是整個(gè) usb 子系統(tǒng)的結(jié)束時(shí)的清理函數(shù).
3、 你必須明白,當(dāng)初 storage_probe()被調(diào)用是發(fā)生在 usb-storage 模塊被加載了并且檢測到了有設(shè)備插入之后的情況下,也就是說有兩個(gè)前提,
第一個(gè) usb-storage 被加載了,
第二個(gè)設(shè)備插入了被檢測到了,
于是storage_probe()被調(diào)用.
而 hub,說她特別,我可絕不是忽悠你.hub 本身就是兩種,一種是普通
的hub,一種是root hub.對于普通hub,它完全可能也是和U盤一樣,在某個(gè)時(shí)刻被你插入,然后
這種情況下hub_probe被調(diào)用,但是對于root hub就不需要這么多廢話了,root hub肯定是有的,只要你有host controller,就一定會(huì)有 root hub,所以hub_probe()基本上是很自然的就被調(diào)用了,不用說非得等待某個(gè)插入事件的發(fā)生,沒這個(gè)必要.
4、 事實(shí)上,每一次調(diào)用 kthread_run()之后,我們都會(huì)用一個(gè)IS_ERR()來判斷指針是否有效. kthread_run()也會(huì)申請內(nèi)存,但非kmalloc申請的內(nèi)存 ,IS_ERR()為1就表示指針有錯(cuò),或者準(zhǔn)確一點(diǎn)說叫做指針無效. 每次調(diào)用完 kthread_run()之后要用 IS_ERR()來檢測一下返回的指針.如果IS_ERR()返回值是0,那么說明沒有問題,于是return 0,也就是說usb_hub_init()就這么結(jié)束了.
5、 內(nèi)核指針:有三種情況,一種是有效指針,一種是 NULL,空指針,一種是錯(cuò)誤指針,或者說無效指針.而所謂的錯(cuò)誤指針就是指其已經(jīng)到達(dá)了最后一個(gè)page.
比如對于32bit的系統(tǒng)來說,內(nèi)核空間最高地址 0xffffffff,那么最后一個(gè) page 就是指的 0xfffff000~0xffffffff(假設(shè)4k一個(gè)page).這段地址是被保留的,一般人不得越雷池半步,如果你發(fā)現(xiàn)你的一個(gè)指針指向這個(gè)范圍中的某個(gè)地址,那么恭喜你,你的代碼肯定出錯(cuò)了.
6、 IS_ERR():對于Linux內(nèi)核來說,不管任何體系結(jié)構(gòu),最多最多,錯(cuò)誤號(hào)不會(huì)超過 4095.而 4095 又正好是比 4k 小 1,即 4096 減 1.而我們知道一個(gè)page可能是4k,這里的 IS_ERR(),它就是判斷 kthread_run()返回的指針是否有錯(cuò),如果指針并不是指向最后一個(gè) page,那么沒有問題,申請成功了,如果指針指向了最后一個(gè) page,那么說明實(shí)際上這不是一個(gè)有效的指針,這個(gè)指針里保存的實(shí)際上是一種錯(cuò)誤代碼.而通常很常用的方法就是先用IS_ERR()來判斷是否是錯(cuò)誤,然后如果是,那么就調(diào)用PTR_ERR()來返回這個(gè)錯(cuò)誤代碼
7、 Hup驅(qū)動(dòng)的思想:
總分總結(jié)構(gòu),
A:先設(shè)置一個(gè)鏈表,hub_event_list,設(shè)置一個(gè)總的函數(shù)hub_events(),這是總,
B:然后每一個(gè) hub 都有一個(gè) event_list,每當(dāng)有一個(gè) hub 的 event_list出現(xiàn)了變化,就把它的 event_list 插入到 hub_event_list 中來,這是分,
C:然后觸發(fā)總函數(shù)hub_events(),這又是總,然后在 hub_events()里又根據(jù) event_list 來確定是哪個(gè) struct usb_hub,或者說是哪個(gè) hub 有事情,又針對該 hub 進(jìn)行具體處理,這又是分.
這就是 Linux 中hub驅(qū)動(dòng)的中心思想
8、 TIF 就是 thread info 的意思,眾所周知,struct task_struct 是一個(gè)表示進(jìn)程的結(jié)構(gòu)體,而除此之外,又有一個(gè)叫做struct thread_info的結(jié)構(gòu)體來代表內(nèi)核線程
9、 Endpoint.spec規(guī)定了hub就是一個(gè)endpoint,中斷endpoint,因?yàn)閔ub的傳輸是中斷傳輸.當(dāng)然還有控制傳輸,但是因?yàn)榭刂苽鬏斒敲恳粋(gè)設(shè)備都必須支持的,即每一個(gè)usb 設(shè)備都會(huì)有一個(gè)控制端點(diǎn),所以在 desc->desc.bNumEndpoints 中是不包含那個(gè)大家都有的控制端點(diǎn)的.因此如果這個(gè)值不為 1,那么就說明又出錯(cuò)了,仍然只能是返回
10、kzalloc():雙重功能函數(shù),kmalloc 并且 memset改內(nèi)存

相關(guān)評論

閱讀本文后您有什么感想? 已有 人給出評價(jià)!

  • 2791 喜歡喜歡
  • 2101 頂
  • 800 難過難過
  • 1219 囧
  • 4049 圍觀圍觀
  • 5602 無聊無聊
熱門評論
最新評論
發(fā)表評論 查看所有評論(0)
昵稱:
表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
字?jǐn)?shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)