電子發(fā)燒友App

硬聲App

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

Linux那些事兒之我是USB的PDF電子書(shū)免費(fèi)下載

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

資料介紹

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

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

  其實(shí),module_init/module_exit 只是一個(gè)宏,通常寫(xiě)模塊的人為了彰顯自己的個(gè)性,會(huì)給自己的初始化函數(shù)和注銷函數(shù)另外起個(gè)名字,比如這里 module_init(usb_stor_init)以及 module_exit(usb_stor_exit)實(shí)際上就是告訴這個(gè)世界,真正的函數(shù)是 usb_stor_init 和 usb_stor_exit.這種伎倆在 Linux 內(nèi)核代碼中屢見(jiàn)不鮮。見(jiàn)多了也就不必大驚小怪了,天要下雨娘要嫁人,隨她去吧。我們下面當(dāng)然就從 usb_stor_init 正式開(kāi)始我們的探索之旅。 外面的世界很精彩看代碼之前,我曾經(jīng)認(rèn)真的思考過(guò)這么一個(gè)問(wèn)題,我需要關(guān)注的僅僅是 drivers/usb/storage/目錄下面那相關(guān)的 3000多行代碼嗎?就是這樣幾個(gè)文件就能讓一個(gè)個(gè)不同的 U盤(pán)在 Linux 下面工作起來(lái)嗎? 像一開(kāi)始那樣把這個(gè)目錄比作一個(gè)小城的話,也許,城里的月光很漂亮,她能夠把人的夢(mèng)照亮,能夠溫暖人的心房。但我們真的就能廝守在這個(gè)城里,一生一世嗎? 很不幸,問(wèn)題遠(yuǎn)不是這樣簡(jiǎn)單。外面的世界很精彩,作為 U 盤(pán),她需要與 usb core 打交道,需要與 scsi core 打交道,需要與內(nèi)存管理單元打交道,還有內(nèi)核中許許多多其它模塊打交道。外面的世界很大,遠(yuǎn)比我們想象的大。 什么是 usb core?她負(fù)責(zé)實(shí)現(xiàn)一些核心的功能,為別的設(shè)備驅(qū)動(dòng)程序提供服務(wù),比如申請(qǐng)內(nèi)存,比如實(shí)現(xiàn)一些所有的設(shè)備都會(huì)需要的公共的函數(shù),事實(shí)上,在 usb 的世界里,一個(gè)普通的設(shè)備要正常的工作,除了要有設(shè)備本身以外,還需要有一個(gè)叫做控制器的冬冬,老外把它叫做 host controller, 和這個(gè)控制器相連接在一起的有另一個(gè)咚咚,她叫 root hub,hub 我們應(yīng)該不會(huì)陌生,在大學(xué)里, 有的宿舍里網(wǎng)口有限,但是我們這一代人上大學(xué)基本上是每人一臺(tái)電腦,所以網(wǎng)口不夠,于是有人會(huì)使用 hub,讓多個(gè)人共用一個(gè)網(wǎng)口,這是以太網(wǎng)上的 hub,而 usb 的世界里同樣有 hub,其實(shí)原理是一樣的,任何支持 usb 的電腦不會(huì)說(shuō)只允許你只能一個(gè)時(shí)刻使用一個(gè) usb 設(shè)備,比如你插入了 u 盤(pán),你同樣還可以插入 usb 鍵盤(pán),還可以再插一個(gè) usb 鼠標(biāo),因?yàn)槟銜?huì)發(fā)現(xiàn)你的電腦里并不只是一個(gè) usb 接口。這些口實(shí)際上就是所謂的 hub 口。而現(xiàn)實(shí)中經(jīng)常是讓一個(gè) usb 控制器和一個(gè) hub 綁定在一起,專業(yè)一點(diǎn)說(shuō)叫集成,而這個(gè) hub 也被稱作 root hub,換言之,和 usb 控制器綁定在一起的hub就是系統(tǒng)中最根本的hub,其它的hub可以連接到她這里,然后可以延伸出去,外接別的設(shè)備,當(dāng)然也可以不用別的 hub,讓 usb 設(shè)備直接接到 root hub 上.hub 干嘛用的我們知道了,那么 usb host controller 本身是干什么用的呢?controller,控制器,顧名思義,用于控制,控制什么,控制所有的 usb 設(shè)備的通信。通常計(jì)算機(jī)的 cpu 并不是直接和 usb 設(shè)備打交道,而是和控制器打交道,他要對(duì)設(shè)備做什么,他會(huì)告訴控制器,而不是直接把指令發(fā)給設(shè)備,然后控制器再去負(fù)責(zé)處理這件事情,他會(huì)去指揮設(shè)備執(zhí)行命令,而 cpu 就不用管剩下的事情,他還是該干嘛干嘛去, 控制器替他去完成剩下的事情,事情辦完了再通知 cpu.否則讓 cpu 去盯著每一個(gè)設(shè)備做每一件事情,那是不現(xiàn)實(shí)的,那就好比讓一個(gè)學(xué)院的院長(zhǎng)去盯著我們每一個(gè)本科生上課,去管理我們的出勤,只能說(shuō),不現(xiàn)實(shí)。所以我們就被分成了幾個(gè)系,通常院長(zhǎng)有什么指示直接跟各系領(lǐng)導(dǎo)說(shuō)就可以了, 如果他要和三個(gè)系主任說(shuō)事情,他即使不把三個(gè)人都召集起來(lái)開(kāi)個(gè)會(huì),也可以給三個(gè)人各打一個(gè)電話,打完電話他就忙他自己的事情去了,比如去和他帶的女碩士風(fēng)花雪月。而三個(gè)系主任就會(huì)去安排下面的人去執(zhí)行具體的任務(wù),完了之后他們就會(huì)像院長(zhǎng)匯報(bào)。 所以,Linux 內(nèi)核開(kāi)發(fā)者們,專門(mén)寫(xiě)了一些代碼,并美其名曰 usb core.時(shí)代總在發(fā)展,當(dāng)年胖楊貴妃照樣迷死唐明皇,而如今人們欣賞的則是林志玲這樣的魔鬼身材。同樣,早期的 Linux 內(nèi)核,其結(jié)構(gòu)并不是如今天這般有層次感,遠(yuǎn)不像今天這般錯(cuò)落有致,那時(shí)候 drivers/usb/這個(gè)目錄下邊放了很多很多文件,usb core 與其他各種設(shè)備的驅(qū)動(dòng)程序的代碼都堆砌在這里,后來(lái),怎奈世間萬(wàn)千的變幻,總愛(ài)把有情的人分兩端。于是在 drivers/usb/目錄下面出來(lái)了一個(gè) core 目錄,就專門(mén)放 11 一些核心的代碼,比如初始化整個(gè) usb 系統(tǒng),初始化 root hub,初始化 host controller 的代碼, 再后來(lái)甚至把 host controller 相關(guān)的代碼也單獨(dú)建了一個(gè)目錄,叫 host 目錄,這是因?yàn)?usb host controller 隨著時(shí)代的發(fā)展,也開(kāi)始有了好幾種,不再像剛開(kāi)始那樣只有一種,所以呢,設(shè)計(jì)者們把一些 host controller 公共的代碼仍然留在 core 目錄下,而一些各 host controller 單獨(dú)的代碼則移到 host 目錄下面讓負(fù)責(zé)各種 host controller 的人去維護(hù),常見(jiàn)的 host controller 有三種,分別叫做 EHCI,UHCI,OHCI,所以這樣,出來(lái)了三個(gè)概念,usb core,usb host,usb device,即原本是一家人,卻被活生生的分成了兩岸三地。..的確,現(xiàn)實(shí)總是很無(wú)奈,然而,心若知道靈犀的方向,哪怕不能夠朝夕相伴?沒(méi)錯(cuò),usb 通信的靈魂就是 usb 協(xié)議。 usb 協(xié)議將是所有 usb 設(shè)備和 usb 主機(jī)所必須遵循的游戲規(guī)則。這種規(guī)則也很自然的體現(xiàn)在了代碼中。于是,我們需要了解的不僅僅是 drivers/usb/storage/目錄下面的冬冬,還得去了解那外面的世界,雖然,只需要了解一點(diǎn)點(diǎn)。

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

評(píng)論

查看更多

下載排行

本周

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

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33564次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21548次下載  |  免費(fèi)
  9. 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書(shū))
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
  16. 0.00 MB  |  6653次下載  |  免費(fèi)

總榜

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