- 1. XnConvert for Linux V1.10 多國(guó)語(yǔ)言官方安裝版
- 2. Adobe Flash Player for Linux(Linux操作系統(tǒng)FLASH...
- 3. Adobe Flash Player for Linux最新官方免費(fèi)下載 V1...
- 4. Linux Kernel操作系統(tǒng)最新官方下載 V2.6.39.1
- 5. 91剪報(bào)(功能全面的電子筆記本) V1.1.7.5 簡(jiǎn)體中文官...
- 6. 火狐中國(guó)版 For Linux最新官方版 V4.0.1
- 7. Linux Kerne(最新版的Linux 內(nèi)核)最新官方下載 V2....
- 8. 電子筆記資料管理軟件(EverNote) V4.3.1 中文免費(fèi)...
- 9. Wine(Linux下運(yùn)行Windows程序的工具) V1.3.17 免...
- 10. Chrome(谷歌瀏覽器)for Linux V13.0 多國(guó)語(yǔ)言免費(fèi)...
讀Linux那些事兒之我是HUB筆記
作者: 來(lái)源: 發(fā)布時(shí)間:2011-4-28 13:32:46 點(diǎn)擊:
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 盤(pán),可以連接usb 鼠標(biāo),同樣也可以連接另一個(gè) hub.所謂 hub,就是用來(lái)級(jí)連;
通常做芯片的同志們會(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 模塊被加載了并且檢測(cè)到了有設(shè)備插入之后的情況下,也就是說(shuō)有兩個(gè)前提,
第一個(gè) usb-storage 被加載了,
第二個(gè)設(shè)備插入了被檢測(cè)到了,
于是storage_probe()被調(diào)用.
而 hub,說(shuō)她特別,我可絕不是忽悠你.hub 本身就是兩種,一種是普通
的hub,一種是root hub.對(duì)于普通hub,它完全可能也是和U盤(pán)一樣,在某個(gè)時(shí)刻被你插入,然后
這種情況下hub_probe被調(diào)用,但是對(duì)于root hub就不需要這么多廢話了,root hub肯定是有的,只要你有host controller,就一定會(huì)有 root hub,所以hub_probe()基本上是很自然的就被調(diào)用了,不用說(shuō)非得等待某個(gè)插入事件的發(fā)生,沒(méi)這個(gè)必要.
4、 事實(shí)上,每一次調(diào)用 kthread_run()之后,我們都會(huì)用一個(gè)IS_ERR()來(lái)判斷指針是否有效. kthread_run()也會(huì)申請(qǐng)內(nèi)存,但非kmalloc申請(qǐng)的內(nèi)存 ,IS_ERR()為1就表示指針有錯(cuò),或者準(zhǔn)確一點(diǎn)說(shuō)叫做指針無(wú)效. 每次調(diào)用完 kthread_run()之后要用 IS_ERR()來(lái)檢測(cè)一下返回的指針.如果IS_ERR()返回值是0,那么說(shuō)明沒(méi)有問(wèn)題,于是return 0,也就是說(shuō)usb_hub_init()就這么結(jié)束了.
5、 內(nèi)核指針:有三種情況,一種是有效指針,一種是 NULL,空指針,一種是錯(cuò)誤指針,或者說(shuō)無(wú)效指針.而所謂的錯(cuò)誤指針就是指其已經(jīng)到達(dá)了最后一個(gè)page.
比如對(duì)于32bit的系統(tǒng)來(lái)說(shuō),內(nèi)核空間最高地址 0xffffffff,那么最后一個(gè) page 就是指的 0xfffff000~0xffffffff(假設(shè)4k一個(gè)page).這段地址是被保留的,一般人不得越雷池半步,如果你發(fā)現(xiàn)你的一個(gè)指針指向這個(gè)范圍中的某個(gè)地址,那么恭喜你,你的代碼肯定出錯(cuò)了.
6、 IS_ERR():對(duì)于Linux內(nèi)核來(lái)說(shuō),不管任何體系結(jié)構(gòu),最多最多,錯(cuò)誤號(hào)不會(huì)超過(guò) 4095.而 4095 又正好是比 4k 小 1,即 4096 減 1.而我們知道一個(gè)page可能是4k,這里的 IS_ERR(),它就是判斷 kthread_run()返回的指針是否有錯(cuò),如果指針并不是指向最后一個(gè) page,那么沒(méi)有問(wèn)題,申請(qǐng)成功了,如果指針指向了最后一個(gè) page,那么說(shuō)明實(shí)際上這不是一個(gè)有效的指針,這個(gè)指針里保存的實(shí)際上是一種錯(cuò)誤代碼.而通常很常用的方法就是先用IS_ERR()來(lái)判斷是否是錯(cuò)誤,然后如果是,那么就調(diào)用PTR_ERR()來(lái)返回這個(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 中來(lái),這是分,
C:然后觸發(fā)總函數(shù)hub_events(),這又是總,然后在 hub_events()里又根據(jù) event_list 來(lái)確定是哪個(gè) struct usb_hub,或者說(shuō)是哪個(gè) hub 有事情,又針對(duì)該 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)體來(lái)代表內(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,那么就說(shuō)明又出錯(cuò)了,仍然只能是返回
10、kzalloc():雙重功能函數(shù),kmalloc 并且 memset改內(nèi)存
usb host controller.一個(gè)是 echi的,三個(gè)是uhci,就是host controller 的接口;
hub:叫做集線器(設(shè)備與host control)
2、 root hub:
Root Hub 上可以連接別的設(shè)備,可以連接 U 盤(pán),可以連接usb 鼠標(biāo),同樣也可以連接另一個(gè) hub.所謂 hub,就是用來(lái)級(jí)連;
通常做芯片的同志們會(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 模塊被加載了并且檢測(cè)到了有設(shè)備插入之后的情況下,也就是說(shuō)有兩個(gè)前提,
第一個(gè) usb-storage 被加載了,
第二個(gè)設(shè)備插入了被檢測(cè)到了,
于是storage_probe()被調(diào)用.
而 hub,說(shuō)她特別,我可絕不是忽悠你.hub 本身就是兩種,一種是普通
的hub,一種是root hub.對(duì)于普通hub,它完全可能也是和U盤(pán)一樣,在某個(gè)時(shí)刻被你插入,然后
這種情況下hub_probe被調(diào)用,但是對(duì)于root hub就不需要這么多廢話了,root hub肯定是有的,只要你有host controller,就一定會(huì)有 root hub,所以hub_probe()基本上是很自然的就被調(diào)用了,不用說(shuō)非得等待某個(gè)插入事件的發(fā)生,沒(méi)這個(gè)必要.
4、 事實(shí)上,每一次調(diào)用 kthread_run()之后,我們都會(huì)用一個(gè)IS_ERR()來(lái)判斷指針是否有效. kthread_run()也會(huì)申請(qǐng)內(nèi)存,但非kmalloc申請(qǐng)的內(nèi)存 ,IS_ERR()為1就表示指針有錯(cuò),或者準(zhǔn)確一點(diǎn)說(shuō)叫做指針無(wú)效. 每次調(diào)用完 kthread_run()之后要用 IS_ERR()來(lái)檢測(cè)一下返回的指針.如果IS_ERR()返回值是0,那么說(shuō)明沒(méi)有問(wèn)題,于是return 0,也就是說(shuō)usb_hub_init()就這么結(jié)束了.
5、 內(nèi)核指針:有三種情況,一種是有效指針,一種是 NULL,空指針,一種是錯(cuò)誤指針,或者說(shuō)無(wú)效指針.而所謂的錯(cuò)誤指針就是指其已經(jīng)到達(dá)了最后一個(gè)page.
比如對(duì)于32bit的系統(tǒng)來(lái)說(shuō),內(nèi)核空間最高地址 0xffffffff,那么最后一個(gè) page 就是指的 0xfffff000~0xffffffff(假設(shè)4k一個(gè)page).這段地址是被保留的,一般人不得越雷池半步,如果你發(fā)現(xiàn)你的一個(gè)指針指向這個(gè)范圍中的某個(gè)地址,那么恭喜你,你的代碼肯定出錯(cuò)了.
6、 IS_ERR():對(duì)于Linux內(nèi)核來(lái)說(shuō),不管任何體系結(jié)構(gòu),最多最多,錯(cuò)誤號(hào)不會(huì)超過(guò) 4095.而 4095 又正好是比 4k 小 1,即 4096 減 1.而我們知道一個(gè)page可能是4k,這里的 IS_ERR(),它就是判斷 kthread_run()返回的指針是否有錯(cuò),如果指針并不是指向最后一個(gè) page,那么沒(méi)有問(wèn)題,申請(qǐng)成功了,如果指針指向了最后一個(gè) page,那么說(shuō)明實(shí)際上這不是一個(gè)有效的指針,這個(gè)指針里保存的實(shí)際上是一種錯(cuò)誤代碼.而通常很常用的方法就是先用IS_ERR()來(lái)判斷是否是錯(cuò)誤,然后如果是,那么就調(diào)用PTR_ERR()來(lái)返回這個(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 中來(lái),這是分,
C:然后觸發(fā)總函數(shù)hub_events(),這又是總,然后在 hub_events()里又根據(jù) event_list 來(lái)確定是哪個(gè) struct usb_hub,或者說(shuō)是哪個(gè) hub 有事情,又針對(duì)該 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)體來(lái)代表內(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,那么就說(shuō)明又出錯(cuò)了,仍然只能是返回
10、kzalloc():雙重功能函數(shù),kmalloc 并且 memset改內(nèi)存
[收藏此文章]
- 1. 來(lái)者不拒 五款超大硬盤(pán)筆記本導(dǎo)購(gòu)
- 2. 讓Linux下播放CSF格式視頻技巧
- 3. 詳細(xì)理解Linux LVM邏輯卷
- 4. 充分利read命令在linux中發(fā)揮強(qiáng)大的作用
- 5. Firefox用戶(hù)迎來(lái)福音: Linux版本開(kāi)始提速
- 6. 讀Linux那些事兒之我是HUB筆記
- 7. 分享閱讀linux內(nèi)核代碼的幾個(gè)技巧
- 8. 蘋(píng)果主攻筆記本市場(chǎng) MacBook Air 6月上市
- 9. 眾望所歸 Linux Deepin 10.12.1今發(fā)布
- 10. 系統(tǒng)廠商N(yùn)ovell推Suse Linux企業(yè)服務(wù)器軟件