Linux那些事兒之我是U盤 5 外面的世界很精彩

2021-08-22 09:25:37 字數 2082 閱讀 5549

看**之前,我曾經認真的思考過這麼乙個問題,我需要關注的僅僅是drivers/usb/storage/目錄下面那相關的3000多行**嗎?就是這樣幾個檔案就能讓乙個個不同的u盤在linux下面工作起來嗎?像一開始那樣把這個目錄比作乙個小城的話,也許,城裡的月光很漂亮,她能夠把人的夢照亮,能夠溫暖人的心房.但我們真的就能廝守在這個城裡,一生一世嗎?

很不幸,問題遠不是這樣簡單.外面的世界很精彩,作為u盤,她需要與usb core打交道,需要與scsi core打交道,需要與記憶體管理單元打交道,還有核心中許許多多其它模組打交道.外面的世界很大,遠比我們想象的大.

什麼是usb core?她負責實現一些核心的功能,為別的裝置驅動程式提供服務,比如申請記憶體,比如實現一些所有的裝置都會需要的公共的函式,事實上,在usb的世界裡,乙個普通的裝置要正常的工作,除了要有裝置本身以外,還需要有乙個叫做控制器的冬冬,老外把它叫做host controller,和這個控制器相連線在一起的有另乙個咚咚,她叫root hub,hub我們應該不會陌生,在大學裡,有的宿舍裡網口有限,但是我們這一代人上大學基本上是每人一台電腦,所以網口不夠,於是有人會使用hub,讓多個人共用乙個網口,這是乙太網上的hub,而usb的世界裡同樣有hub,其實原理是一樣的,任何支援usb的電腦不會說只允許你只能乙個時刻使用乙個usb裝置,比如你插入了u盤,你同樣還可以插入usb鍵盤,還可以再插乙個usb滑鼠,因為你會發現你的電腦裡並不只是乙個usb介面.這些口實際上就是所謂的hub口.而現實中經常是讓乙個usb控制器和乙個hub繫結在一起,專業一點說叫整合,而這個hub也被稱作root hub,換言之,和usb控制器繫結在一起的hub就是系統中最根本的hub,其它的hub可以連線到她這裡,然後可以延伸出去,外接別的裝置,當然也可以不用別的hub,讓usb裝置直接接到root hub上.hub幹嘛用的我們知道了,那麼usb host controller本身是幹什麼用的呢?controller,控制器,顧名思義,用於控制,控制什麼,控制所有的usb裝置的通訊.通常計算機的cpu並不是直接和usb裝置打交道,而是和控制器打交道,他要對裝置做什麼,他會告訴控制器,而不是直接把指令發給裝置,然後控制器再去負責處理這件事情,他會去指揮裝置執行命令,而cpu就不用管剩下的事情,他還是該幹嘛幹嘛去,控制器替他去完成剩下的事情,事情辦完了再通知cpu.否則讓cpu去盯著每乙個裝置做每一件事情,那是不現實的,那就好比讓乙個學院的院長去盯著我們每乙個本科生上課,去管理我們的出勤,只能說,不現實.所以我們就被分成了幾個系,通常院長有什麼指示直接跟各系領導說就可以了,如果他要和三個系主任說事情,他即使不把三個人都召集起來開個會,也可以給三個人各打乙個**,打完**他就忙他自己的事情去了,比如去和他帶的女碩士風花雪月.而三個系主任就會去安排下面的人去執行具體的任務,完了之後他們就會像院長匯報.

所以,linux核心開發者們,專門寫了一些**,並美其名曰usb core.時代總在發展,當年胖楊貴妃照樣迷死唐明皇,而如今人們欣賞的則是林志玲這樣的魔鬼身材.同樣,早期的linux核心,其結構並不是如今天這般有層次感,遠不像今天這般錯落有致,那時候drivers/usb/這個目錄下邊放了很多很多檔案,usb core與其他各種裝置的驅動程式的**都堆砌在這裡,後來,怎奈世間萬千的變幻,總愛把有情的人分兩端.於是在drivers/usb/目錄下面出來了乙個core目錄,就專門放一些核心的**,比如初始化整個usb系統,初始化root hub,初始化host controller的**,再後來甚至把host controller相關的**也單獨建了乙個目錄,叫host目錄,這是因為usb host controller隨著時代的發展,也開始有了好幾種,不再像剛開始那樣只有一種,所以呢,設計者們把一些host controller公共的**仍然留在core目錄下,而一些各host controller單獨的**則移到host目錄下面讓負責各種host controller的人去維護,常見的host controller有三種,分別叫做ehci,uhci,ohci,所以這樣,出來了三個概念,usb core,usb host,usb device,即原本是一家人,卻被活生生的分成了兩岸三地...的確,現實總是很無奈,然而,心若知道靈犀的方向,哪怕不能夠朝夕相伴?沒錯,usb通訊的靈魂就是usb協議. usb協議將是所有usb裝置和usb主機所必須遵循的遊戲規則.這種規則也很自然的體現在了**中.於是,我們需要了解的不僅僅是drivers/usb/storage/目錄下面的冬冬,還得去了解那外面的世界,雖然,只需要了解一點點.

Linux那些事兒之我是U盤 24 心鎖

如果大家沒意見的話,我們繼續usb stor acquire resources函式.761至764行,這沒啥好說的吧.就是剛才urb申請了之後判斷是否申請成功了,如果指標為null那麼就是失敗了.直接返回 enomem.別往下了.767行,哦,又乙個傢伙閃亮登場了,dev semaphore,這是...

讀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...