電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示
創(chuàng)作
電子發(fā)燒友網>電子資料下載>嵌入式開發(fā)>Linux那些事兒之我是USB的PDF電子書免費下載

Linux那些事兒之我是USB的PDF電子書免費下載

2020-07-29 | pdf | 11.65 MB | 次下載 | 5積分

資料介紹

  也許是在復旦養(yǎng)成了晝伏夜出的壞習慣,工作之后也總是很晚也不愿意睡。來到北京之后,開始聽廣播聽都市之聲的北京不眠夜。這個節(jié)目是從 23 點直到第二天凌晨一點,我常常是聽完了才會睡覺。無論是北京還是上海,對我來說,生存總是那么困難,生活的壓力總是那么大,每天只有在這個節(jié)目中才能夠尋找到一絲溫暖。我不喜歡躺在床上聽,而是喜歡一邊聽一邊做點別的事情,于是心血來潮的決定,寫點文字吧,聽著電波里別人分享心情,不妨也用文字來記錄自己的心情吧。 我首先想到的是寫一些和Linux相關的文字。事實上我并不喜歡Linux,學習Linux完全是一種無奈,工作中要用,迫于生計,不得不去學習,而學習 Linux 的過程中唯一讓我覺得還有些樂趣的是當遇到問題的時候可以去網上問去網上查,很多人寫了很多文檔可以讓我們這些菜鳥們參考學習,這樣才讓我們在工作中走了很多彎路。挺感謝那些分享自己知識的人。碰巧最近 3 我也看了點冬冬,并且這些冬冬在網上的資料也比較少,所以我想我不妨也把自己那一夜的收獲寫出來,或許以后也能給別人提供一些幫助,想想也是,整個 Linux 社區(qū)不正是這樣嗎,像陳奕迅唱的那樣,”把一個人的溫暖轉移到另一個人的胸膛”。 我要寫的是 Linux 設備驅動程序相關的,主要分析的是 Linux 中與 U 盤相關的那部分代碼。 過去也沒有看過,但是今年 4 月底的某一天,一個偶然的原因,我一時沖動就看了一遍。我們幾個同學在人大附近打麻將,打到夜深了,因為我們幾人人住的位置都離得挺遠的,各自回去都得打車,于是決定不如去權金城開個房間,晚上就睡那得了。在權金城洗浴中心,和幾個同學洗浴過后,有人去按摩了,而我和另一個人則留在了房間里,無聊中,那位哥們見我?guī)Я?a href='http://srfitnesspt.com/v/tag/1247/' target='_blank' class='arckwlink_none'>電腦,說他有部 A 片,很不錯,不是很大,所以他存在 U 盤里的,他還挺逗的說這是 2008 年北京奧運會指定 A 片,問我有沒有興趣,這還用問,當然有興趣了,于是立馬打開電腦,插入 u 盤,然后不一會我就傻了,因為我的電腦根本就不能識別 U 盤,首先我的電腦比較舊,裝的是雙系統,一個是 Win 98,這個沒辦法,沒有 U 盤驅動,另一個是 Linux,2.6 的內核,按理應該是支持 U 盤的, 問題是實際情況卻是我沒有看到 U 盤,/dev/目錄下面根本沒有這么一個盤符,于是我沒辦法了,一臉沮喪,而同學在旁邊自然表示出了對 Linux 很鄙視的神情。 過了一會,他去看電視了,正好有英超,我卻沒有心情看電視,想想就覺得奇怪,怎么會不能使用 U 盤呢,這不可能啊,一定是我自己對 Linux 下面的一些冬冬沒有弄清楚,于是我決定好好看看問題到底出在哪,記得當時看了一下/var/log/messages 這個日志文件里邊好像記錄了一些信息,感覺像是一些錯誤信息,但是看不明白它到底在說什么。同學開始勸我,算了算了, 改天再看吧,這話我可不愿意聽,不是說 Linux 內核源代碼是公開的嗎,大不了看看源代碼,搞清楚工作原理了還怕問題不能解決?無非就是一些 C 代碼而已,好歹哥們也是認真學過譚浩強大哥那本 C 程序設計的。而且當初那本書課后習題老師基本上都讓我們做了,雖說是參考了那本習題解答的書,可就算寫代碼不行,讀代碼還是沒問題吧,語法什么的基本上還是很清楚的,什么判斷結構循環(huán)結構,包括 goto 語句,還是記得的。 所以我就開始看了,正所謂夢想有多遠,就能走多遠。以前我只是玩 CS 玩仙劍的時候能夠整晚整晚不睡,但那個晚上,為了告訴我同學,Linux 下也能看 A 片,Linux 下遇到問題更適合自己解決,我愣是從一點看到快天亮,終于把 drivers/usb/storage/目錄下面一萬余行的代碼給看了一遍。當然沒有看得太仔細,但是很顯然把整個原理搞清楚了,問題也很快得以解決。 所以此刻,我整理了一下思路,決定把那晚看的冬冬用文字記錄下來。也算為了紀念那個不尋常的夜晚吧。不過我估計這個篇幅不會短,因為光那一萬余行的代碼貼出來就得占許許多多頁了,所以這件事情也許會占用我不少時間,然而,還好,每晚有北京不眠夜的陪伴,而且,也許當我把心思投入到寫這個故事的時候,能夠把那些壓力那些煩惱那種孤獨那種郁悶以及那種對生活的絕望給暫時忘記些許。

  有一種感動,叫淚流滿面,有一種機制,叫模塊機制,十月革命一聲炮響,給 Linux 送來了模塊機制。 顯然,這種模塊機制給那些 Linux 的發(fā)燒友們帶來了方便,因為模塊機制意味著人們可以把龐大的 Linux 內核劃分為許許多多個小的模塊,對于編寫設備驅動程序的那幫家伙來說,從此以后他們可以編寫設備驅動程序卻不需要把她編譯進內核,不用 reboot 機器,她只是一個模塊,當你需要她的時候,你可以把她抱入懷中(insmod),當你不再需要她的時候,你可以把她一腳踢開,甚至, 你可以對她咆哮:“滾吧,賤人!”(rmmod)。她不能成為你的手足,只能算你的衣服。 也許在現實世界里不會這樣,但是在 Linux 的虛擬世界里,確實可以是如此,time and time again,我問自己,模塊是否就像現實生活中的妓女一樣呢?Linux 內核是嫖客,當他需要這個模塊的時候,他就把人家攬入懷中,當他不需要人家的時候,就把別人踢開,而且,模塊總是能夠逆來順受,盡管 Linux 內核會一次次拋棄她,但是每當 Linux 內核再次需要她的時候,當內核再次執(zhí)行 insmod 的時候,模塊依然會盡自己的能力去取悅內核,這是否太可悲了些!記得孔子曾經說過,讀懂Linux內核代碼不難,難得是讀懂Linux內核代碼背后的哲學!難道這就是傳說中的藏在Linux 代碼背后的哲學!天哪! 拋開這見鬼的哲學吧。讓我們從一個偉大的例子去認識模塊。這就是傳說中的“Hello World!”,這個夢幻般的名字我們看過無數次了,每一次她出現在眼前,就意味著我們開始接觸一種新的計算機語言了,或者,如此刻,開始描述一個新的故事。 請看下面這段代碼,她就是 Linux 下的一個最簡單的模塊。當你安裝這個模塊的時候,她會用她特有的語言向你表白,“Hello,world!”,千真萬確,她沒有說“Honey,I love you!”,雖然,她可以這么說,如果你要求她這么說。而后來你卸載了這個模塊,你無情拋棄了她,她很傷心,她很絕望,但她沒有抱怨,她只是淡淡地說,“Goodbye,cruel world!”(再見,殘酷的世界?。?/p>

  其實,module_init/module_exit 只是一個宏,通常寫模塊的人為了彰顯自己的個性,會給自己的初始化函數和注銷函數另外起個名字,比如這里 module_init(usb_stor_init)以及 module_exit(usb_stor_exit)實際上就是告訴這個世界,真正的函數是 usb_stor_init 和 usb_stor_exit.這種伎倆在 Linux 內核代碼中屢見不鮮。見多了也就不必大驚小怪了,天要下雨娘要嫁人,隨她去吧。我們下面當然就從 usb_stor_init 正式開始我們的探索之旅。 外面的世界很精彩看代碼之前,我曾經認真的思考過這么一個問題,我需要關注的僅僅是 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 鼠標,因為你會發(fā)現你的電腦里并不只是一個 usb 接口。這些口實際上就是所謂的 hub 口。而現實中經常是讓一個 usb 控制器和一個 hub 綁定在一起,專業(yè)一點說叫集成,而這個 hub 也被稱作 root hub,換言之,和 usb 控制器綁定在一起的hub就是系統中最根本的hub,其它的hub可以連接到她這里,然后可以延伸出去,外接別的設備,當然也可以不用別的 hub,讓 usb 設備直接接到 root hub 上.hub 干嘛用的我們知道了,那么 usb host controller 本身是干什么用的呢?controller,控制器,顧名思義,用于控制,控制什么,控制所有的 usb 設備的通信。通常計算機的 cpu 并不是直接和 usb 設備打交道,而是和控制器打交道,他要對設備做什么,他會告訴控制器,而不是直接把指令發(fā)給設備,然后控制器再去負責處理這件事情,他會去指揮設備執(zhí)行命令,而 cpu 就不用管剩下的事情,他還是該干嘛干嘛去, 控制器替他去完成剩下的事情,事情辦完了再通知 cpu.否則讓 cpu 去盯著每一個設備做每一件事情,那是不現實的,那就好比讓一個學院的院長去盯著我們每一個本科生上課,去管理我們的出勤,只能說,不現實。所以我們就被分成了幾個系,通常院長有什么指示直接跟各系領導說就可以了, 如果他要和三個系主任說事情,他即使不把三個人都召集起來開個會,也可以給三個人各打一個電話,打完電話他就忙他自己的事情去了,比如去和他帶的女碩士風花雪月。而三個系主任就會去安排下面的人去執(zhí)行具體的任務,完了之后他們就會像院長匯報。 所以,Linux 內核開發(fā)者們,專門寫了一些代碼,并美其名曰 usb core.時代總在發(fā)展,當年胖楊貴妃照樣迷死唐明皇,而如今人們欣賞的則是林志玲這樣的魔鬼身材。同樣,早期的 Linux 內核,其結構并不是如今天這般有層次感,遠不像今天這般錯落有致,那時候 drivers/usb/這個目錄下邊放了很多很多文件,usb core 與其他各種設備的驅動程序的代碼都堆砌在這里,后來,怎奈世間萬千的變幻,總愛把有情的人分兩端。于是在 drivers/usb/目錄下面出來了一個 core 目錄,就專門放 11 一些核心的代碼,比如初始化整個 usb 系統,初始化 root hub,初始化 host controller 的代碼, 再后來甚至把 host controller 相關的代碼也單獨建了一個目錄,叫 host 目錄,這是因為 usb host controller 隨著時代的發(fā)展,也開始有了好幾種,不再像剛開始那樣只有一種,所以呢,設計者們把一些 host controller 公共的代碼仍然留在 core 目錄下,而一些各 host controller 單獨的代碼則移到 host 目錄下面讓負責各種 host controller 的人去維護,常見的 host controller 有三種,分別叫做 EHCI,UHCI,OHCI,所以這樣,出來了三個概念,usb core,usb host,usb device,即原本是一家人,卻被活生生的分成了兩岸三地。..的確,現實總是很無奈,然而,心若知道靈犀的方向,哪怕不能夠朝夕相伴?沒錯,usb 通信的靈魂就是 usb 協議。 usb 協議將是所有 usb 設備和 usb 主機所必須遵循的游戲規(guī)則。這種規(guī)則也很自然的體現在了代碼中。于是,我們需要了解的不僅僅是 drivers/usb/storage/目錄下面的冬冬,還得去了解那外面的世界,雖然,只需要了解一點點。

下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1TC358743XBG評估板參考手冊
  2. 1.36 MB  |  330次下載  |  免費
  3. 2開關電源基礎知識
  4. 5.73 MB  |  6次下載  |  免費
  5. 3100W短波放大電路圖
  6. 0.05 MB  |  4次下載  |  3 積分
  7. 4嵌入式linux-聊天程序設計
  8. 0.60 MB  |  3次下載  |  免費
  9. 5基于FPGA的光纖通信系統的設計與實現
  10. 0.61 MB  |  2次下載  |  免費
  11. 6基于FPGA的C8051F單片機開發(fā)板設計
  12. 0.70 MB  |  2次下載  |  免費
  13. 751單片機窗簾控制器仿真程序
  14. 1.93 MB  |  2次下載  |  免費
  15. 8基于51單片機的RGB調色燈程序仿真
  16. 0.86 MB  |  2次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應用800例(新編版)
  4. 0.00 MB  |  33564次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關電源設計實例指南
  8. 未知  |  21548次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數字電路基礎pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅動電路設計》 溫德爾著
  16. 0.00 MB  |  6653次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉中文版)
  4. 78.1 MB  |  537796次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420026次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191185次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183278次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費