变态重口极致另类在线-波多久久夜色精品国产-波多野结衣在线观看一区-波多野结衣在线观看一区二区-污污的网站免费阅读-污污视频网址

當(dāng)前位置:首頁文章首頁 IT學(xué)院 IT技術(shù)

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

作者:  來源:  發(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 盤,可以連接usb 鼠標(biāo),同樣也可以連接另一個(gè) hub.所謂 hub,就是用來級(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è)備插入之后的情況下,也就是說有兩個(gè)前提,
第一個(gè) usb-storage 被加載了,
第二個(gè)設(shè)備插入了被檢測(cè)到了,
于是storage_probe()被調(diào)用.
而 hub,說她特別,我可絕不是忽悠你.hub 本身就是兩種,一種是普通
的hub,一種是root hub.對(duì)于普通hub,它完全可能也是和U盤一樣,在某個(gè)時(shí)刻被你插入,然后
這種情況下hub_probe被調(diào)用,但是對(duì)于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ì)申請(qǐng)內(nèi)存,但非kmalloc申請(qǐng)的內(nèi)存 ,IS_ERR()為1就表示指針有錯(cuò),或者準(zhǔn)確一點(diǎn)說叫做指針無效. 每次調(diào)用完 kthread_run()之后要用 IS_ERR()來檢測(cè)一下返回的指針.如果IS_ERR()返回值是0,那么說明沒有問題,于是return 0,也就是說usb_hub_init()就這么結(jié)束了.
5、 內(nèi)核指針:有三種情況,一種是有效指針,一種是 NULL,空指針,一種是錯(cuò)誤指針,或者說無效指針.而所謂的錯(cuò)誤指針就是指其已經(jīng)到達(dá)了最后一個(gè)page.
比如對(duì)于32bit的系統(tǒng)來說,內(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)核來說,不管任何體系結(jié)構(gòu),最多最多,錯(cuò)誤號(hào)不會(huì)超過 4095.而 4095 又正好是比 4k 小 1,即 4096 減 1.而我們知道一個(gè)page可能是4k,這里的 IS_ERR(),它就是判斷 kthread_run()返回的指針是否有錯(cuò),如果指針并不是指向最后一個(gè) page,那么沒有問題,申請(qǐng)成功了,如果指針指向了最后一個(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 有事情,又針對(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)體來代表內(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)存

文章評(píng)論

軟件按字母排列: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
主站蜘蛛池模板: 3751性欧美视频在线播放 | 日日狠狠久久8888av | 丝袜足控免费软件xx | 亚洲综合色一区 | 国产精品福利在线观看秒播 | 激情文学综合丁香 | 免费看大美女大黄大色 | 国产精品一区二区在线观看 | 日韩国产欧美成人一区二区影院 | www在线视频| 你懂得在线视频 | 日韩在线不卡视频 | 国产视频网站在线 | 日日摸夜夜添夜夜添人人爽 | 黄色在线视频免费看 | 波多野结衣在线观看一区二区 | 岛国午夜精品视频在线观看 | 亚洲永久免费网站 | 亚洲男女视频 | 额去鲁97在线观看视频 | 2020天堂中文字幕一区在线观 | 夫妻生活毛片 | 小明在看看永久免费平台 | 91福利国产在线观看一区二区 | 亚洲精品人成网在线播放影院 | 中文伦理 | 毛片线看免费观看 | 精品导航第一导航 | www.日日干| 欧美日韩综合在线视频免费看 | 操美女在线看 | 在线观看国产精品一区 | 一级黄色片a | 色视频大全 | 国产亚洲成在线播放va | 极品美女a∨片在线看 | 一区二区三区四区在线观看视频 | 欧美成人免费观看国产 | 一级女性全黄久久生活片免费 | 天天摸天天躁天天添天天爽 | 日韩一区国产一级 |