出版時間:2010-7 出版社:肖林甫、肖季東、 任橋偉 電子工業(yè)出版社 (2010-07出版) 作者:肖林甫 等 著 頁數(shù):563
Tag標(biāo)簽:無
前言
1991年,Linux誕生了。又因為開放源代碼的緣故,十幾年來Linux是越來越火,熊熊火焰也燒到了華夏大地。諸多高校開始開設(shè)Linux相關(guān)的課程,諸多企業(yè)開始招聘Linux相關(guān)的人才。市面上關(guān)于Linux的書籍也層出不窮,而這其中大致分為兩類,一類是應(yīng)用方面的書籍,比如介紹如何組建各種服務(wù)器;另一類是內(nèi)核方面的書籍,主要都是對內(nèi)核源代碼進(jìn)行分析,這方面的書籍則以《Linux設(shè)備驅(qū)動程序》和《深入理解Linux內(nèi)核》為經(jīng)典代表。而從眼下國內(nèi)的人才市場來看,懂Linux內(nèi)核的人找工作肯定不用發(fā)愁。事實上,不夸張地說,當(dāng)代大學(xué)生,如果能夠看完以上這兩本書,并且能夠看懂,那么在北京、上海、深圳這些一線城市,很容易就能找到一份體面的技術(shù)類工作。 那么為什么我們還要另起爐灶再寫一本Linux內(nèi)核方面的書籍呢?因為Linux內(nèi)核包含大量的代碼,以上面兩本書為代表的很多Linux內(nèi)核的書籍涵蓋的內(nèi)容太廣,大多數(shù)書籍都是把Linux內(nèi)核中的各個部分逐一地進(jìn)行介紹和分析,然而實際情況是沒有任何一個人能夠?qū)inux內(nèi)核的各個部分都很精通,包括Linus Torvalds本人。一個對Linux開發(fā)感興趣的人也不一定需要并且有足夠的時間對Linux的每個部分都去深入理解。而另一方面,很多對Linux內(nèi)核感興趣的朋友常常被一個問題所困擾,那就是Linux內(nèi)核那么龐大的代碼量,對于初學(xué)者來說,應(yīng)該從哪里學(xué)起呢?關(guān)于這一點,其實《Linux設(shè)備驅(qū)動程序》給出了很好的答案,學(xué)習(xí)驅(qū)動程序代碼是最有效的入門方法。第一是因為在龐大的Linux內(nèi)核源代碼中,大約87.53%是各種驅(qū)動程序代碼,其重要性可想而知,第二是因為相比較來說,驅(qū)動程序的代碼其難度是比較低的,很少涉及復(fù)雜高深的算法,所以適合初學(xué)者研讀。 然而網(wǎng)友“永不墮落”曾經(jīng)問過我們:“既然已經(jīng)有了《Linux設(shè)備驅(qū)動程序》,為什么你們還要寫一本Linux設(shè)備驅(qū)動程序相關(guān)的書呢?你們這樣做是不是行為藝術(shù)呢?”這里我們想說的是,雖然《Linux設(shè)備驅(qū)動程序》這本書很強大了,把各種類型的設(shè)備驅(qū)動程序都給介紹了一番,可是當(dāng)一些讀者讀完這本書之后,他們敢說自己會寫Linux設(shè)備驅(qū)動程序了嗎?他們敢說自己完全了解一個真實的Linux設(shè)備驅(qū)動程序是怎么寫的嗎?至少本書作者當(dāng)年在看完這本書之后,雖然覺得獲益匪淺,可是仍然不太清楚真實的Linux設(shè)備驅(qū)動程序是怎么寫的,仍然不敢認(rèn)為自己就會寫Linux設(shè)備驅(qū)動程序了。這才有了后來決定親自選擇一個子系統(tǒng)進(jìn)行研究,并在研究好了之后把研究心得寫出來,與大家進(jìn)行分享。最終我們選擇的是USB子系統(tǒng),原因很簡單,USB總線及連接在USB總線上的各種USB設(shè)備已經(jīng)廣泛地出現(xiàn)在了當(dāng)代計算機上,廣大計算機用戶,尤其是高校學(xué)生,接觸得最多的設(shè)備也正是USB設(shè)備,所以研究和分析USB總線,以及它上面的各種USB設(shè)備應(yīng)該能讓大家感到很親切很真實并且具有相當(dāng)?shù)膶嵱脙r值和懷舊意義。有人曾經(jīng)說過:“USB總線就像一條河,左岸是我無法忘卻的回憶,右岸是我值得緊握的璀璨年華,中間流淌的,是我年年歲歲淡淡的感傷!” 本書的編寫得到了許多人的幫助,在此向他們致以誠摯的謝意。首先感謝孫學(xué)瑛編輯,沒有她的努力,這本書的內(nèi)容將會一直偏居網(wǎng)絡(luò)一隅,將不可能被出版從而去幫助更多需要的人。然后要感謝很多在技術(shù)上給予我們指導(dǎo)與幫助的老師和朋友,特別是USB這邊的maintaner之一,Alan Stem大俠對我們的問題的耐心解答與回復(fù)。
內(nèi)容概要
《Linux那些事兒之我是USB》基于2.6.22內(nèi)核,對USB子系統(tǒng)的大部分源代碼逐行進(jìn)行分析,系統(tǒng)地闡釋了Linux內(nèi)核中USB子系統(tǒng)是如何運轉(zhuǎn)的,子系統(tǒng)內(nèi)部的各個模塊之間是如何互相協(xié)作互相配合的?!禠inux那些事兒之我是USB》使用幽默詼諧的筆調(diào)對Linux內(nèi)核中的USB子系統(tǒng)源代碼進(jìn)行了分析,形象且詳盡地介紹了USB在Linux中的實現(xiàn)?!禠inux那些事兒之我是USB》從U盤、Hub、USB Core直到主機控制器覆蓋了USB實現(xiàn)的方方面面,被一些網(wǎng)友譽為USB開發(fā)的“圣經(jīng)”。 對于Linux初學(xué)者,可以通過《Linux那些事兒之我是USB》掌握學(xué)習(xí)內(nèi)核、瀏覽內(nèi)核代碼的方法;對于Linux驅(qū)動開發(fā)者,可以通過《Linux那些事兒之我是USB》對設(shè)備模型有形象深刻的理解;對于USB開發(fā)者,可以通過《Linux那些事兒之我是USB》全面的理解USB在一個操作系統(tǒng)中的實現(xiàn);對于Linux內(nèi)核開發(fā)者,也可以通過《Linux那些事兒之我是USB》學(xué)習(xí)到很多Linux高手開發(fā)維護(hù)一個完整子系統(tǒng)時的編程思想。
書籍目錄
第1篇 Linux那些事兒之我是USB Core1.引子 22.它從哪里來 23.PK 34.漫漫辛酸路 35.我型我秀 46.我是一棵樹 57.我是誰 98.好戲開始了 119.不一樣的core 1310.從這里開始 1711.面紗 2012.模型,又見模型 2213.繁華落盡 2614.接口是設(shè)備的接口 2815.設(shè)置是接口的設(shè)置 3216.端點 3517.設(shè)備 3718.配置 4519.向左走,向右走 4820.設(shè)備的生命線(一) 5321.設(shè)備的生命線(二) 5622.設(shè)備的生命線(三) 6123.設(shè)備的生命線(四) 6724.設(shè)備的生命線(五) 7325.設(shè)備的生命線(六) 8026.設(shè)備的生命線(七) 8827.設(shè)備的生命線(八) 9428.設(shè)備的生命線(九) 10029.設(shè)備的生命線(十) 10430.設(shè)備的生命線(十一) 10931.驅(qū)動的生命線(一) 12232.驅(qū)動的生命線(二) 12733.驅(qū)動的生命線(三) 13134.驅(qū)動的生命線(四) 13535.字符串描述符 13836.接口的驅(qū)動 14737.還是那個match 15038.結(jié)束語 155第2篇 Linux那些事兒之我是HUB1.引子 1572.跟我走吧,現(xiàn)在就出發(fā) 1573.特別的愛給特別的Root Hub 1584.一樣的精靈不一樣的API 1605.那些隊列,那些隊列操作函數(shù) 1646.等待,只因曾經(jīng)承諾 1697.最熟悉的陌生人——probe 1718.蝴蝶效應(yīng) 1749.While You Were Sleeping(一) 17810.While You Were Sleeping(二) 18311.While You Were Sleeping(三) 18512.While You Were Sleeping(四) 19113.再向虎山行 19414.樹,是什么樣的樹 19815.沒完沒了的判斷 20116.一個都不能少 20617.蓋茨家對Linux代碼的影響 21518.八大重量級函數(shù)閃亮登場(一) 22019.八大重量級函數(shù)閃亮登場(二) 22320.八大重量級函數(shù)閃亮登場(三) 22521.八大重量級函數(shù)閃亮登場(四) 23722.八大重量級函數(shù)閃亮登場(五) 24123.是月亮惹的禍還是spec的錯 24924.所謂的熱插拔 251第3篇 Linux那些事兒之我是UHCI1.引子 2562.開戶和銷戶 2583.PCI,我們來了! 2624.I/O內(nèi)存和I/O端口 2705.傳說中的DMA 2756.來來,我是一條總線,線線線線線線 2817.主機控制器的初始化 2858.有一種資源,叫中斷 2939.一個函數(shù)引發(fā)的故事(一) 29510.一個函數(shù)引發(fā)的故事(二) 29811.一個函數(shù)引發(fā)的故事(三) 30312.一個函數(shù)引發(fā)的故事(四) 30913.一個函數(shù)引發(fā)的故事(五) 31114.寂寞在唱歌 31315.Root Hub的控制傳輸(一) 32116.Root Hub的控制傳輸(二) 32717.非Root Hub的批量傳輸 33918.傳說中的中斷服務(wù)程序(ISR) 34519.Root Hub的中斷傳輸 36220.非Root Hub的中斷傳輸 36421.等時傳輸 37522.“脫”就一個字 381第4篇 Linux那些事兒之我是U盤1.小城故事 3882.Makefile 3893.變態(tài)的模塊機制 3904.想到達(dá)明天現(xiàn)在就要啟程 3925.外面的世界很精彩 3946.未曾開始卻似結(jié)束 3957.狂歡是一群人的孤單 3968.總線、設(shè)備和驅(qū)動(上) 3979.總線、設(shè)備和驅(qū)動(下) 39810.我是誰的他 40011.從協(xié)議中來,到協(xié)議中去(上) 40112.從協(xié)議中來,到協(xié)議中去(中) 40313.從協(xié)議中來,到協(xié)議中去(下) 40514.夢開始的地方 40615.設(shè)備花名冊 41116.冰凍三尺非一日之寒 41217.冬天來了,春天還會遠(yuǎn)嗎?(一) 41618.冬天來了,春天還會遠(yuǎn)嗎?(二) 42219.冬天來了,春天還會遠(yuǎn)嗎?(三) 42520.冬天來了,春天還會遠(yuǎn)嗎?(四) 42721.冬天來了,春天還會遠(yuǎn)嗎?(五) 43122.通往春天的管道 43623.傳說中的URB 44024.彼岸花的傳說(一) 44325.彼岸花的傳說(二) 44526.彼岸花的傳說(三) 44827.彼岸花的傳說(四) 45128.彼岸花的傳說(五) 45329.彼岸花的傳說(六) 45730.彼岸花的傳說(七) 46031.彼岸花的傳說(八) 46332.彼岸花的傳說(The End) 46733.SCSI命令之我型我秀 46834.迷霧重重的批量傳輸(一) 47235.迷霧重重的批量傳輸(二) 47636.迷霧重重的批量傳輸(三) 47937.迷霧重重的批量傳輸(四) 48438.迷霧重重的批量傳輸(五) 48939.迷霧重重的批量傳輸(六) 49340.迷霧重重的批量傳輸(七) 49541.跟著感覺走(一) 50042.跟著感覺走(二) 50343.有多少愛可以胡來?(一) 50944.有多少愛可以胡來?(二) 51345.當(dāng)夢醒了天晴了 51846.其實世上本有路,走的人多了,也便沒了路 522附錄 Linux那些事兒之我是sysfs1.sysfs初探 5262.設(shè)備模型 5273.設(shè)備底層模型 5284.設(shè)備模型上層容器 5325.示例一:usb子系統(tǒng) 5356.示例二:usb storage驅(qū)動 5417.sysfs文件系統(tǒng) 5478.文件系統(tǒng) 5479.sysfs 55310.file_oprations 55811.示例一:讀入sysfs目錄的內(nèi)容 55812.示例二:讀入sysfs普通文件的內(nèi)容 561
章節(jié)摘錄
插圖:我們可以知道struct device中的bus表示這個設(shè)備連到哪個總線上,driver表示這個設(shè)備的驅(qū)動是什么。struct device-driver中的bus表示這個驅(qū)動屬于哪個總線,klist-devices表示這個驅(qū)動都支持哪些設(shè)備,因為這里device是復(fù)數(shù),又是list,更因為一個驅(qū)動可以支持多個設(shè)備,而一個設(shè)備只能綁定一個驅(qū)動。當(dāng)然,structbus-type中的drivers和devices分別表示了這個總線擁有哪些設(shè)備和哪些驅(qū)動。我們還需要看一看什么是klist和kset。還有上面device和driver結(jié)構(gòu)中出現(xiàn)的kobiect結(jié)構(gòu)是什么?我可以肯定地告訴你,kobject和kset都是Lnux設(shè)備模型中最基本的元素,總線、設(shè)備、驅(qū)動是西瓜,kobjcet、klist是種瓜的人,沒有幕后種瓜人的汗水不會有清爽解渴的西瓜。我們不能光知道西瓜是多么的甜,還要知道種瓜人的辛苦。kobject和kset不會在意自己的得失,它們存在的意義在于把總線、設(shè)備和驅(qū)動這樣的對象連接到設(shè)備模型上。種瓜的人也不會在意自己的汗水,在意的只是能不能種出甜蜜的西瓜。一般來說應(yīng)該這么理解,整個Linux的設(shè)備模型是一個00的體系結(jié)構(gòu),總線、設(shè)備和驅(qū)動都是其中鮮活存在的對象,kobject是它們的基類,所實現(xiàn)的只是一些公共的接口,kset是同種類型kobject對象的集合,也可以說是對象的容器。只是因為c語言里不可能會有C++語言里類的class繼承、組合等的概念,只有通過kobject嵌入到對象結(jié)構(gòu)中來實現(xiàn)。這樣,內(nèi)核使用kobject將各個對象連接起來組成了一個分層的結(jié)構(gòu)體系。kobiect結(jié)構(gòu)中包含了parent成員,指向了另一個kobject結(jié)構(gòu),也就是這個分層結(jié)構(gòu)的上一層結(jié)點。而kset是通過鏈表來實現(xiàn)的,這樣就可以明白,struct bus_type結(jié)構(gòu)中的成員drivers和devices表示了一條總線擁有兩條鏈表,一條是設(shè)備鏈表,一條是驅(qū)動鏈表。我們知道了總線對應(yīng)的數(shù)據(jù)結(jié)構(gòu),就可以找到這條總線關(guān)聯(lián)了多少設(shè)備,又有哪些驅(qū)動來支持這類設(shè)備。
媒體關(guān)注與評論
牛人,讀罷你們的文字,對Linux頓感興趣。 ——網(wǎng)友uspark 博主這么多優(yōu)秀文章,真是讓我吃了N頓飽餐啊哈~可惜發(fā)現(xiàn)得太晚,要是在3年之前就看到多好~ ——網(wǎng)友sunwill_chen 第一次看的是U盤部分,硬著頭皮看完了55個小節(jié),現(xiàn)在來看PCI部分,有種一通百通的感覺,非常不錯! ——網(wǎng)友haierfox 過來拜一個,這幾天一直從頭看博主的“Linux那些事兒”,我就一直在納悶,什么神人才能把復(fù)雜枯燥的驅(qū)動寫得那樣華麗,那樣搔首弄姿,那樣讓人欲罷不能…… ——網(wǎng)友windwinter 有一種文章,看了直犯困,有一種文章,越看越興奮,博主你咋這么讓人興奮呢? ——網(wǎng)友phoenix_zhang 畢業(yè)設(shè)計是USB設(shè)備驅(qū)動,看了那個USB Core簡直勝過看所有的書啊。把所有自己不清楚的內(nèi)容都說明白了,無限膜拜中…… ——網(wǎng)友rabbit8ge 第一眼看到樓主的文章,立刻就被吸引了,詼諧的語言讓人看起技術(shù)文章來感覺不到枯燥,樓主不去做老師真是浪費,現(xiàn)在的老師沒有幾個能讓人聽課不瞌睡的。 ——網(wǎng)友likefreebird 在過度疲勞的工作中看到樓主的文章,失笑了多回。雖然沒太懂,也沒來得及看完。我借助它解決了SCSI設(shè)備號固定于硬端口的問題。贊一個:是金子總是要發(fā)光的。 ——網(wǎng)友yzdai 剛看了幾眼你的文章就喜歡上了,很喜歡你的文風(fēng)。現(xiàn)在的書要是文字都這么輕松該多好啊!感謝你為全人類做出的貢獻(xiàn)! ——網(wǎng)友Felk2005 非常喜歡您關(guān)于USB開發(fā)的幾部經(jīng)典作品,用超乎尋常的經(jīng)典方式學(xué)習(xí)、解剖經(jīng)典的技術(shù)。 ——網(wǎng)友learner太經(jīng)典了,花了4天時間終于看完了,這是我看過的最好的技術(shù)文章! ——網(wǎng)友raindown 我也是因為工作緣故開始使用Linux開發(fā)程序,接觸有半年多,期間一直只是用GCC編寫程序,覺得跟WIN平臺比,從應(yīng)用程序開發(fā)的角度來看,并不需要跨越多么大的鴻溝,所以始終沒有閱讀Linux內(nèi)核代碼的動機。 以前做過USB設(shè)備端的驅(qū)動程序,對USB協(xié)議有所了解。但我知道對于設(shè)備驅(qū)動程序開發(fā)來說,Linux與WIN平臺的區(qū)別相當(dāng)大。在看本書的過程中,越來越強烈地感覺到,這真的是一本妙趣橫生的驚艷大作!我一口氣用了4個鐘頭左右的時間從頭到尾看完,一直看到凌晨2點多。我覺得這是我迄今為止看過的最有意思的技術(shù)類書籍,甚至年少時期狂熱愛的科普類書籍也趕不上本書風(fēng)格的九牛一毛。 ——網(wǎng)友zlzdsp
編輯推薦
《Linux那些事兒之我是USB》:技術(shù)凝聚實力,專業(yè)創(chuàng)新出版
圖書封面
圖書標(biāo)簽Tags
無
評論、評分、閱讀與下載