本書結閤大量實例,在基於ARM Cortex-A9四核處理器Exynos4412的硬件教學平颱和PC機上,全麵詳細講解瞭Linux設備驅動開發。主要內容包含開發環境的搭建,內核模塊,字符設備驅動框架,高級I/O,中斷和時間管理,互斥和同步,內存和DMA,Linux設備模型,外設的驅動實例,總綫類設備驅動,塊設備驅動,網絡設備驅動和內核調試技巧。對每一個知識點都有一個對應的典型實例,大多數實例既可以在上麵說到的嵌入式平颱上運行,也可以在PC機上運行。
第1章 概述 1
第2章 內核模塊 6
2.1 第一個內核模塊程序 7
2.2 內核模塊的相關工具 10
2.3 內核模塊一般的形式 11
2.4 將多個源文件編譯生成一個內核模塊 13
2.5 內核模塊參數 15
2.6 內核模塊依賴 17
2.7 關於內核模塊的進一步討論 20
2.8 習題 21
第3章 字符設備驅動 23
3.1 字符設備驅動基礎 24
3.2 字符設備驅動框架 30
3.3 虛擬串口設備 35
3.4 虛擬串口設備驅動 35
3.5 一個驅動支持多個設備 39
3.6 習題 45
第4章 高級I/O操作 46
4.1 ioctl設備操作 47
4.2 proc文件操作 56
4.3 非阻塞型I/O 58
4.4 阻塞型I/O 60
4.5 I/O多路復用 65
4.6 異步I/O 69
4.7 幾種I/O模型總結 73
4.8 異步通知 74
4.9 mmap設備文件操作 83
4.10 定位操作 88
4.11 習題 90
第5章 中斷和時間管理 92
5.1 中斷進入過程 93
5.2 驅動中的中斷處理 98
5.3 中斷下半部 101
5.3.1 軟中斷 102
5.3.2 tasklet 104
5.3.3 工作隊列 106
5.4 延時控製 108
5.5 定時操作 109
5.5.1 低分辨率定時器 109
5.5.2 高分辨率定時器 112
5.6 習題 114
第6章 互斥和同步 116
6.1 一種典型的競態 117
6.2 內核中的並發 117
6.3 中斷屏蔽 118
6.4 原子變量 119
6.5 自鏇鎖 120
6.6 讀寫鎖 122
6.7 順序鎖 123
6.8 信號量 125
6.9 讀寫信號量 127
6.10 互斥量 127
6.11 RCU機製 128
6.12 虛擬串口驅動加入互斥 130
6.13 完成量 134
6.14 習題 135
第7章 內存和DMA 137
7.1 內存組織 138
7.2 按頁分配內存 139
7.3 slab分配器 142
7.4 不連續內存頁分配 144
7.5 per-CPU變量 145
7.6 動態內存實例 146
7.7 I/O內存 147
7.8 DMA原理及映射 155
7.8.1 DMA工作原理 155
7.8.2 DMA映射 157
7.9 DMA統一編程接口 160
7.10 習題 164
第8章 Linux設備模型 166
8.1 設備模型基礎 167
8.2 總綫、設備和驅動 171
8.3 平颱設備及其驅動 176
8.3.1 平颱設備 176
8.3.2 平颱驅動 178
8.3.3 平颱驅動簡單實例 179
8.3.4 電源管理 182
8.3.5 udev和驅動的自動加載 183
8.3.6 使用平颱設備的LED驅動 184
8.3.7 自動創建設備節點 190
8.4 Linux設備樹 193
8.4.1 Linux設備樹的由來 193
8.4.2 Linux設備樹的目的 194
8.4.3 Linux設備樹的使用 195
8.4.4 使用設備樹的LED驅動 202
8.5 習題 204
第9章 字符設備驅動實例 205
9.1 LED驅動 206
9.2 基於中斷的簡單按鍵驅動 209
9.3 基於輸入子係統的按鍵驅動 213
9.4 ADC驅動 222
9.5 PWM驅動 231
9.6 RTC驅動 239
第10章 總綫類設備驅動 243
10.1 I2C設備驅動 244
10.1.1 I2C協議簡介 244
10.1.2 Linux I2C驅動 246
10.1.3 I2C設備驅動實例 251
10.2 SPI設備驅動 258
10.2.1 SPI協議簡介 258
10.2.2 Linux SPI驅動 259
10.2.3 SPI設備驅動範例 264
10.3 USB設備驅動 268
10.3.1 USB協議簡介 268
10.3.2 Linux USB驅動 271
10.3.3 USB設備驅動實例 274
10.4 PCI設備驅動 283
10.4.1 PCI協議簡介 283
10.4.2 Linux PCI驅動 287
10.4.3 PCI設備驅動實例 288
10.5 習題 296
第11章 塊設備驅動 298
11.1 磁盤結構 299
11.2 塊設備內核組件 300
11.3 塊設備驅動核心數據結構和函數 301
11.4 塊設備驅動實例 308
11.5 習題 316
第12章 網絡設備驅動 317
12.1 網絡層次結構 318
12.2 網絡設備驅動核心數據結構和函數 319
12.3 網絡設備驅動實例 327
12.4 DM9000網絡設備驅動代碼分析 333
12.5 NAPI 340
12.6 習題 343
第13章 內核調試技術 344
13.1 內核調試方法 345
13.1.1 內核調試概述 345
13.1.2 學會分析內核源程序 346
13.1.3 調試方法介紹 346
13.2 內核打印函數 350
13.2.1 內核鏡像解壓前的串口輸齣函數 350
13.2.2 內核鏡像解壓後的串口輸齣函數 352
13.2.3 內核打印函數 353
13.3 獲取內核信息 357
13.3.1 係統請求鍵 357
13.3.2 通過/proc接口 358
13.3.3 通過/sys接口 359
13.4 處理齣錯信息 362
13.4.1 oops信息 362
13.4.2 panic 364
13.4.3 通過ioctl方法 366
13.5 內核源碼調試 367
13.6 習題 369
第14章 搭建開發環境 370
14.1 準備Linux開發主機 371
14.2 安裝串口相關軟件 375
14.2.1 安裝串口驅動 375
14.2.2 安裝串口終端軟件PuTTY 376
14.2.3 安裝串口終端軟件minicom 377
14.3 安裝TFTP和NFS服務器 379
14.4 準備Linux內核源碼 381
14.5 在目標闆上運行Linux係統 382
14.6 源碼瀏覽及編輯器環境 386
習題答案 388
參考文獻 389
前言
隨著嵌入式及物聯網技術地快速發展,ARM處理器已經廣泛地應用到瞭工業控製、智能儀錶、汽車電子、醫療電子、軍工電子、網絡設備、消費類電子、智能終端等領域。而較新的ARM Cortex-A9架構的四核處理器更是由於其優越的性能被廣泛應用到瞭中高端的電子産品市場。比如基於ARM Cortex-A9的三星Exynos4412處理器就被應用在瞭三星GALAXY Note II智能手機上。
另外,Linux內核由於其高度的穩定性和可裁剪性等特點,被廣泛地應用到瞭嵌入式係統,Android係統就是一個典型的例子。這樣,ARM處理器就和Linux操作係統緊密地聯係在瞭一起。所以,基於ARM和Linux的嵌入式係統就得到瞭快速的發展。
嵌入式係統是一個定製的係統,所以韆變萬化、形形色色的硬件都必須要有對應的驅動纔能使其正常工作,為這些硬件設備編寫驅動就是不可避免的瞭。雖然有很多內核開發人員已經為很多常見的硬件開發瞭驅動,但是驅動的升級一般都跟不上新硬件的升級。筆者就多次遇到過內核的驅動和同一係列的升級版本芯片不匹配的情況,這時就要改寫驅動程序。所以內核層次的底層開發幾乎都要和驅動打交道。另外,瞭解驅動(或者說內核)的一些底層工作原理,也有助於我們寫齣更穩定、更高效的應用層代碼。
為瞭能夠實現這一目標,並促進嵌入式技術的推廣,華清遠見研發中心自主研發瞭一套基於Exynos4412處理器的開發闆FS4412,並組織編寫瞭本書。本書注重實踐、實用,沒有用長篇大論來反復強調一些旁枝末節的內容,但是對於會影響理解的部分又非常詳細地分析瞭內核源碼,並給齣瞭大量的圖示。書中的各個實例雖然為瞭突齣相關的知識重點而簡化瞭對某些問題的討論,不能稱得上工程上嚴格意義的好驅動,但是確實也具備瞭對應的設備驅動開發所必需的各方麵。實例按照工程上驅動開發的增量式方式來進行,即先有主體再逐漸完善,循序漸進。讀者按照實例能夠迅速掌握對應驅動的開發精要,對整個驅動的實現也就有瞭一個清晰的思路。
本書共14章,循序漸進地講解瞭嵌入式Linux設備驅動開發所涉及的理論基礎和大量API說明,並配有大量驅動實例。全書主要分為五部分:第一部分是Linux設備驅動開發的概述,包含第1章;第二部分是模塊及字符設備驅動的理論,包含第2~8章;第三部分是字符設備驅動實例,包含第9章和第10章;第四部分是Linux塊設備驅動和網絡設備驅動,包含第11章和第12章;最後一部分是Linux內核的調試和開發環境的搭建,包含第13章和第14章。各章節的主要內容如下。
第1章概述瞭需要瞭解Linux驅動程序的人群、Linux驅動開發的特點和本書其他各章節的核心內容。
第2章對Linux內核的模塊進行瞭介紹,現在的驅動幾乎都以Linux內核模塊的形式來實現,所以這是後續的基礎。
第3章講解Linux字符設備驅動的主體框架,並以一個假想的串口來實現驅動。這是Linux設備驅動入門的關鍵,所以分析瞭大量的內核源碼。當然,這個驅動是不完善的,需要在後麵的各章節逐步添加功能。
第4章在上一章的基礎上探討瞭字符設備的高級I/O操作,包括ioctl、阻塞、I/O多路復用、異步通知、mmap、定位等,還特彆介紹瞭proc相關的接口。
第5章講解中斷和時間管理,為便於理解,特彆加入瞭中斷進入的內核源碼分析。時間管理則包含瞭延時和定時兩部分,在定時部分還討論瞭新內核中的高分辨率定時器。
第6章講解瞭互斥和同步,為瞭讓讀者明白互斥對驅動開發的重要性,特彆從ARM匯編的層次來討論瞭競態。除瞭對傳統的互斥(自鏇鎖、信號量等)進行討論外,還特彆說明瞭RCU機製和使用的範例。
第7章講解瞭內核中內存的各種分配方式,還特彆談到瞭per-CPU變量的使用。最後,對DMA的討論則專注於新內核引入的dmaengine子係統,並用一個實例進行瞭具體的展現。
第8章講解瞭Linux設備模型,這部分內容比較抽象。為瞭能幫助讀者理解這部分內容,專門實現瞭設備、總綫、驅動三個最簡單的實例,從而使讀者完全掌握三者之間的關係。這一章的後半部分有大量實用技術的展現,包括電源管理、驅動的自動加載、設備節點的自動創建等。最後還講解瞭較新的內核引入的ARM體係結構的設備樹。
第9章在前麵的理論基礎上實現瞭大量外設的驅動。這些驅動並不都是通過字符設備框架來實現的,目的就是想告訴讀者,如果我們能夠簡化驅動的編寫,就盡量簡化驅動的編寫,多使用內核中已經實現的機製。
第10章講解瞭總綫類設備驅動的開發,對流行的I2C總綫、SPI總綫、USB總綫和PCI總綫都進行瞭討論。這些總綫都有一個共同的特性,就是都有主機控製器和連接在總綫上的設備,我們隻討論瞭在主機控製器驅動之上的設備驅動,不討論主機控製器驅動及設備自身的固件或驅動,因為設備驅動是最常開發的驅動。
第11章講解瞭塊設備驅動,為瞭便於讀者對這部分知識進行理解,特彆介紹瞭磁盤的內部結構,然後用內存虛擬瞭一個磁盤,用兩種方式實現瞭該虛擬磁盤的塊設備驅動。
第12章講解瞭網絡設備驅動,用一個虛擬的環迴以太網卡的驅動展現瞭網絡設備驅動的主體框架,還分析瞭DM9000網卡驅動的主體框架部分,並和前麵的虛擬網卡驅動進行瞭對比。
第13章介紹瞭內核的一些調試技術。內核的調試相對來說比較麻煩,但隻要能熟練使用這些調試技術,還是能較快找齣問題所在的。
第14章是嵌入式Linux設備驅動開發環境的搭建,包含瞭主機係統的準備和各個軟件的安裝。尤其是用vim搭建瞭一個適閤於驅動開發的類似於IDE的編輯環境,能夠大大提高代碼的編寫效率。
本書由華清遠見成都中心的薑先剛編寫,北京中心的劉洪濤承擔全書的統稿及審校工作,是賈燕楓、楊曼、袁祖剛、關曉強、譚翠君、李媛媛、張丹、張誌華、曹忠明、苗德行、馮利美、盧閆進、蔡濛等老師心血的結晶,也是他們多年教學成果的積纍。他們認真閱讀瞭書稿,提齣瞭大量的建議,並糾正瞭書稿中的很多錯誤,在此特錶示感謝。
由於作者水平有限,書中不妥之處在所難免,懇請讀者批評指正。對於本書的批評和建議,可以發錶到www.farsight.com.cn技術論壇。
編 者
2017年3月
坦白說,我是一個對技術細節非常挑剔的人,市麵上很多教程往往要麼過於淺顯,要麼就充斥著各種晦澀難懂的術語。但是,這本《嵌入式Linux驅動開發教程》真的讓我眼前一亮。作者在講解每一個概念的時候,都會追溯到最根本的原理,並且將理論與實踐完美地結閤起來。我尤其欣賞書中對文件係統和塊設備驅動的講解。我之前一直對文件係統的工作原理感到模糊,但作者通過對VFS(Virtual File System)的詳細介紹,以及如何實現一個簡單的塊設備驅動,讓我對文件係統的層次結構和操作流程有瞭清晰的認識。書中對字符設備驅動的講解也十分到位,從`file_operations`結構體的各個成員函數的含義,到如何進行讀寫操作,再到如何處理ioctl命令,都講解得非常細緻。而且,作者還針對一些常見的驅動開發問題,提供瞭解決方案和優化建議,這對於我們這些在實際開發中會遇到各種坑的工程師來說,簡直是救星!這本書的內容嚴謹而深入,絕對不是那種“看瞭等於沒看”的教程,它能真正幫助讀者建立起紮實的驅動開發功底。
評分我是一位多年從事嵌入式係統開發的工程師,一直以來都專注於應用層的開發,對於底層驅動這塊一直是個短闆。在朋友的推薦下,我購買瞭這本《嵌入式Linux驅動開發教程》,沒想到它帶來的啓發比我想象的要大得多。書中對Linux內核的整體架構和關鍵子係統的介紹,讓我對Linux操作係統有瞭更係統、更深入的理解。作者不僅僅是講解驅動的編寫,更注重從整體上把握驅動開發在整個Linux係統中的位置和作用。比如,書中對內核同步機製的講解,包括自鏇鎖、互斥鎖、信號量等等,讓我明白瞭在多綫程、多進程的環境下,如何安全地訪問共享資源,這對於防止競態條件、保證程序的穩定性至關重要。另外,書中關於設備樹(Device Tree)的講解也讓我耳目一新。我之前一直覺得設備樹是個神秘的玩意兒,難以理解,但作者通過生動的例子,將設備樹的語法、編譯以及在驅動中的應用都講得清清楚楚,讓我能夠快速上手,並理解它在現代嵌入式Linux開發中的重要性。這本書的實踐性也很強,提供瞭大量的代碼示例,並且都經過瞭實際驗證,這對於我們這些需要快速解決實際問題的工程師來說,非常有價值。
評分這本書的深度和廣度都讓我感到驚喜。我之前也看過一些關於嵌入式Linux驅動的書籍,但大多都停留在錶麵,要麼講得很淺,要麼就直接拋齣大量復雜的代碼,讓人望而生畏。而這本《嵌入式Linux驅動開發教程》則不同,它就像一位經驗豐富的老師,一步步地引導我進入驅動開發的殿堂。尤其讓我印象深刻的是書中對中斷處理機製的講解。我一直覺得中斷是個很玄乎的東西,但在作者細緻入微的解釋下,我纔真正理解瞭中斷的産生、上半部和下半部的處理流程,以及相關的API函數。書中還專門講解瞭如何編寫一個能夠正確處理中斷的驅動,並且提供瞭不少實用的技巧,比如如何避免中斷風暴,如何優化中斷處理的效率等等。這對於我這個新手來說,簡直是寶藏!此外,書中關於內存管理和DMA的章節也寫得非常精彩。瞭解這些底層機製對於編寫高性能的驅動至關重要,而作者並沒有迴避這些復雜的內容,而是用通俗易懂的語言,配閤清晰的圖解,將它們一一呈現。讀完這些章節,我感覺自己對嵌入式Linux係統的理解上升到瞭一個新的高度。
評分這本書真是讓我大開眼界!我一直對嵌入式係統很感興趣,但總是覺得無從下手,尤其是驅動開發這塊,聽起來就非常高深。拿到這本《嵌入式Linux驅動開發教程》後,我抱著試一試的心態翻開瞭它,結果完全超齣瞭我的預期。作者的講解非常有條理,從最基礎的概念講起,循序漸進,生怕讀者會落下任何一個細節。比如說,書中在講到Linux內核的模塊化設計時,用瞭大量的篇幅來解釋什麼是內核模塊,以及如何編寫和加載一個簡單的模塊。我之前一直以為驅動開發就是直接去修改內核代碼,看完這部分纔明白,原來模塊化設計能讓我們的驅動開發更靈活,而且不至於對整個內核造成不可控的影響。而且,書中還詳細介紹瞭Linux設備模型,這是一個我之前完全陌生的概念,但作者通過生動的例子和清晰的圖示,讓我很快理解瞭設備、總綫、驅動之間的關係。這對於我理解整個驅動的架構至關重要。我特彆喜歡書中對一些經典驅動的剖析,比如GPIO、UART、I2C等,這些都是嵌入式開發中最常用的接口,作者不僅給齣瞭代碼示例,還深入分析瞭背後的原理,讓我不僅知其然,更知其所以然。讀完這些章節,我對如何編寫一個高效、穩定的驅動有瞭更深刻的認識。
評分作為一名剛剛踏入嵌入式Linux開發領域的新手,我常常感到茫然和不知所措,市麵上各種技術資料更是讓人眼花繚亂。幸運的是,我發現瞭這本《嵌入式Linux驅動開發教程》。這本書簡直是為我量身打造的!它以一種極其友好的方式,將原本復雜晦澀的驅動開發知識變得易於理解。我最喜歡的是書中對Linux設備模型中“總綫-設備-驅動”三元組模式的詳細闡述。作者用非常生動的比喻,讓我一下子就抓住瞭這個核心概念,並且理解瞭如何將自己的驅動與硬件設備進行匹配。書中還提供瞭大量的調試技巧和方法,比如如何使用`printk`進行日誌輸齣,如何利用`gdb`進行內核調試,以及如何分析`/proc`和`/sys`文件係統中的信息。這些實用的技巧,讓我能夠更有效地排查和解決開發過程中遇到的各種問題。此外,書中對電源管理和低功耗設計的介紹,也讓我意識到瞭在嵌入式係統中優化功耗的重要性,並且學習到瞭一些實現方法。總而言之,這本書不僅教授瞭知識,更傳授瞭解決問題的思維方式,讓我對未來的驅動開發之路充滿瞭信心。
評分講的還行,關鍵是有帶設備樹的知識
評分不錯的書!很好!!!!
評分味道還好。味道還好。味道還好。
評分還行
評分還不錯,挺好的一本書,看好就買吧
評分不錯!!!!!!!
評分書的質量好,內容不錯,很好。
評分嵌入式軟件驅動開發之經典,不可不看
評分味道還好。味道還好。味道還好。
本站所有內容均為互聯網搜尋引擎提供的公開搜索信息,本站不存儲任何數據與內容,任何內容與數據均與本站無關,如有需要請聯繫相關搜索引擎包括但不限於百度,google,bing,sogou 等
© 2025 book.coffeedeals.club All Rights Reserved. 靜流書站 版權所有