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

2021-09-21 08:46:58 字數 2504 閱讀 2152

革命尚未成功,繼續看我們的hub

1、usb裝置能夠使用條件:乙個是 usbcore,這就是核心模組,另乙個是主機控制器的驅動程式

usb host controller.乙個是 echi的,三個是uhci,就是host controller 的介面;

hub:叫做集線器(裝置與host control)

2、root hub:

root hub 上可以連線別的裝置,可以連線 u 盤,可以連線usb 滑鼠,同樣也可以連線另乙個 hub.所謂 hub,就是用來級連;

通常做晶元的同志們會把 host controller 和 root hub 整合在一起.特別是 pc 主機上,通常你就只能看到介面,看不到root hub

subsys_initcall(usb_init)的意思就是告訴我們 usb_init 是我們真正的初始化函式,而 usb_exit()將是整個 usb 子系統的結束時的清理函式.

3、你必須明白,當初 storage_probe()被呼叫是發生在 usb-storage 模組被載入了並且檢測到了有裝置插入之後的情況下,也就是說有兩個前提,

第乙個usb-storage 

被載入了,

第二個裝置插入了被檢測到了,

於是storage_probe()被呼叫.

而 hub,說她特別,我可絕不是忽悠你.hub 本身就是兩種,一種是普通

的hub,一種是root hub.對於普通hub,它完全可能也是和u盤一樣,在某個時刻被你插入,然後

這種情況下hub_probe被呼叫,但是對於

root hub

就不需要這麼多廢話了,root hub肯定是有的,只要你有host controller,就一定會有 root hub,所以hub_probe()基本上是很自然的就被呼叫了,不用說非得等待某個插入事件的發生,沒這個必要.

4、事實上,每一次呼叫 kthread_run()之後,我們都會用乙個is_err()來判斷指標是否有效. kthread_run()也會申請記憶體,但非kmalloc申請的記憶體

,is_err()為1就表示指標有錯,或者準確一點說叫做指標無效. 每次呼叫完 kthread_run()之後要用 is_err()來檢測一下返回的指標.如果is_err()返回值是0,那麼說明沒有問題,於是return 0,也就是說usb_hub_init()就這麼結束了.

5、核心指標:有三種情況,一種是有效指標

,一種是 null,空指標,一種是錯誤指標

,或者說無效指標

.而所謂的錯誤指標就是指其已經到達了最後乙個

page.

比如對於32bit的系統來說,核心空間最高位址 0xffffffff,那麼最後乙個 page 就是指的 0xfffff000~0xffffffff(假設4k乙個page).這段位址是被保留的,一般人不得越雷池半步,如果你發現你的乙個指標指向這個範圍中的某個位址,那麼恭喜你,你的**肯定出錯了.

6、is_err():對於linux核心來說,不管任何體系結構,最多最多,錯誤號不會超過

4095.而 4095 又正好是比 4k 小 1,即 4096 減 1.而我們知道乙個page可能是4k,這裡的 is_err(),它就是判斷 kthread_run()返回的指標是否有錯,如果指標並不是指向最後乙個 page,那麼沒有問題,申請成功了,如果指標指向了最後乙個 page,那麼說明實際上這不是乙個有效的指標,這個指標裡儲存的實際上是一種錯誤**

.而通常很常用的方法就是先用is_err()來判斷是否是錯誤,然後如果是,那麼就呼叫

ptr_err()

來返回這個錯誤**

7、hup驅動的思想:

總分總結構,

a:先設定乙個鍊錶,hub_event_list,設定乙個總的函式hub_events(),這是總,

b:然後每乙個 hub 都有乙個 event_list,每當有乙個 hub 的 event_list出現了變化,就把它的 event_list 插入到 hub_event_list 中來,這是分,

c:然後觸發總函式hub_events(),這又是總,然後在 hub_events()裡又根據 event_list 來確定是哪個 struct usb_hub,或者說是哪個 hub 有事情,又針對該 hub 進行具體處理,這又是分.

這就是linux 

中hub

驅動的中心思想

8、tif 就是 thread info 的意思,眾所周知,struct task_struct 是乙個表示程序的結構體,而除此之外,又有乙個叫做struct thread_info的結構體來代表核心執行緒

9、endpoint.spec規定了

hub就是乙個

endpoint,

中斷endpoint,因為hub的傳輸是中斷傳輸.當然還有控制傳輸,但是因為控制傳輸是每乙個裝置都必須支援的,即每乙個usb 裝置都會有乙個控制端點,所以在

desc->desc.bnumendpoints 

中是不包含那個大家都有的控制端點的.因此如果這個值不為 1,那麼就說明又出錯了,仍然只能是返回

10、kzalloc():雙重功能函式,kmalloc 並且 memset改記憶體

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

12 events 通過ps el檢視 events被叫做工作者執行緒,或者說 worker threads,更確切的說,這些應該是預設的工作者執行緒.而與工作者執行緒相關的乙個概念就是工作佇列 或者叫 work queue.工作佇列的作用 是把工作推後,交由乙個核心執行緒去執行,更直接的說就是如果...

讀Linux那些事兒之我是U盤筆記(一)

我是u盤 1 模組 insmod 裝置插入,module init 被稱為驅動程式的初始化入口 rmmod 裝置拔出,module exit 2 usb core 什麼是usb core?她負責實現一些核心的功能,為別的裝置驅動程式提供服務,比如申請記憶體,比如實現一些所有的裝置都會需要的公共的函式...

讀Linux那些事兒之我是U盤筆記(八)

37 錯誤處理 device reset 在這裡對應的就是登出,bus reset 對應的就是重起 功能 給裝置傳送乙個 reset 的 request,然後clear掉halt feature,保證裝置的端點沒有停止.就這些,這就夠了.bus reset usb lock device for r...