Linux Device Drivers,Third Ed
 Jonathan Corbet、Alessandro Rubini、Greg
  Kroah-Hartman/著,
 林長毅/譯
 O'Reilly出版
 售價:39.95美元
 推薦:Amazon四顆星

 

什麼人會想要寫Linux驅動程式?硬體產品推陳出新的速度(還有被淘汰的速度),保證可讓驅動程式設計工作應接不暇。想研究硬體裝置的個人,可能會想知道驅動程式如何駕馭特定裝置。想進入廣大Linux市場的硬體廠商,勢必要提供自家產品的Linux驅動程式。

這就是《Linux Device Drivers, 3rd Ed》(中譯本《Linux驅動程式第三版》)存在的價值。本書主旨是教導如何寫出裝置驅動程式,但因為驅動程式與核心息息相關,要想寫出好的驅動程式,必須先理解核心某些子系統的運作原理,以及Linux開發者所做的一些設計抉擇。為此,本書提供了許多關於核心運作細節的知識。對於不想寫驅動程式的讀者,本書提供的背景知識也是很有價值的資訊來源。

驅動程式設計者必須知道的核心子系統
Linux的狂熱份子應該會發現,本書是相當充實的精神糧食,提供了具體可用的程式碼,幫助跨越初期的摸索之苦,讓讀者盡快具備參與開發團隊的能力,和大家一起研發新功能,提昇運作效率。雖然本書並未完整涵括整個Linux核心,但至少清楚地交代了驅動程式設計師所必須知道的每一個核心子系統。因此,本書可當成核心程式設計的敲門磚。

另一方面,如果讀者真的純粹只想為自己的硬體撰寫驅動程式,而不想探究核心內部的運作原理,本書的編排方式也應該能滿足讀者的需求。如果讀者不想涉入太多細節,不妨略過大部份的技術性章節,將注意力集中在驅動程式所用的標準API,看看它們如何與核心的各子系統合作無間。

在Linux核心中,驅動程式扮演特殊的「黑盒子」角色,它們能駕馭硬體裝置,使硬體的回應方式符合一組嚴謹定義的程式介面,而隱藏了硬體的實際運作細節。應用程式透過一組標準化的「呼叫」來間接操作硬體;以實際的硬體動作來實現系統呼叫所定義的功能,正是驅動程式所扮演的角色。由於這層軟體介面的存在,使得驅動程式與核心的其餘部份可以分開製作,並且在需要時,才在執行期將驅動程式「安插」到核心裡。如此的模組化設計,不僅降低了Linux驅動程式的設計難度,也使得核心不必為了支援新硬體而頻頻改版。

先建立軟體概念,再討論硬體議題
綜觀本書的第一部份,所有題材的安排順序,大致上是從軟體概念開始,然後才逐漸談到硬體相關的議題。如此的安排方式讓讀者可以盡量在自己機器上測試軟體,而不必安裝額外的硬體。每一章都有一些範例程式,讓讀者可在任何Linux電腦上進行實驗。

本書第二部份(第十二章到第十八章)的重點擺在block driver、網路介面、以及一些進階議題,包括如何使用虛擬記憶體子系統,以及關於PCI與USB匯流排的知識。雖然讀者不見得會需要這些方面的所有資訊,但是讀者最好還是花點時間閱讀。這部份的題材主要涉及到Linux核心的運作方式,雖然不見得有助於為硬體開發驅動程式,但是卻有助於提昇技術素養。

本書指導讀者寫出自己的驅動程式,以及如何探索核心中的相關部份。本書會示範程式設計的技巧,解說核心的驅動程式介面,盡可能不涉及任何特定硬體裝置。當然,每種硬體裝置都各有自己的特性,身為驅動程式設計者,讀者必須徹底瞭解讀者想驅動的硬體。

雖然硬體上的差異很大,但是所有驅動程式的原理與基本技術大部份都相同。本書無法解說讀者所面對的硬體裝置,但是會提供足夠的基本知識,讓讀者知道如何使目標裝置能發揮作用。

重點放在2.6版,不考慮2.4回溯相容
當讀者學習如何設計驅動程式時,讀者將學到許多關於Linux核心的知識,而這將有助於讀者瞭解機器的運作原理,以及為何事情沒有讀者想像中的快,或沒按照讀者的預期來發生。本書會循序漸進地介紹新觀念,從最簡單的驅動程式開始,然後在原有基礎上逐步擴充。每種新觀念都伴隨有範例程式,讓讀者印證自己的心得。這些範例程式都不需要特殊硬體配備,就可任意測試。

Linux驅動程式與核心的版本息息相關,這本書試著讓《Linux驅動程式》的內容能跟上新版核心的腳步。第一版《Linux 驅動程式》出版時,主要是以2.0與 2.2版核心為準;第二版則是針對2.4版核心;第三版以2.6版核心為準。

本書將重點完全放在2.6版核心,不考慮回溯相容問題。因為從2.4到2.6的演進實在太劇烈,要維持相容性有其技術上的困難。如果讀者需要寫出適用於2.4版核心的驅動程式,請參考本書的第二版。
第三版新添了許多關於2.6版核心的題材,特別是大幅擴充了對於locking與concurrency的討論,並詳述2.6版核心全新提出的「Linux 裝置模型」,加強對於USB匯流排與串列驅動程式子系統的探討,對於PCI的討論也更深入。除此之外的其它章節,雖然大致上仍維持舊版的整體架構,但幾乎每一章的內容都有更新。

本書架構
第二章首先介紹「模組化」,解開模組化技術的奧秘。在第三章,作者利用記憶體來模擬一個字元裝置,藉此示範如何寫出一個完整的Char driver,可以任意讀寫。使用記憶體作為硬體基礎,好處是不必特殊硬體就可測試範例程式。

第四章介紹除錯技術,這是程式師的求生工具。對於研究作業系統核心的人來說,必須熟悉concurrency與race condition的管理,這正是第五章的重點。有了除錯與共時管理技術之後,作者在第六章深入探討char driver的進階功能,像是blocking operation、select()的用法,以及重要的ioctl()。

在談及硬體管理之前,作者先仔細探討核心的幾個軟體介面。第七章解釋核心如何控管「時間」,第八章講解記憶體配置。接下來將焦點轉移到硬體。第九章解說如何管理硬體裝置上的I/O埠與緩衝記憶體;第十章緊接著討論「中斷處置(interrupt handling)」。

第十一章解說核心所用的資料型別,以及如何寫出可移植的程式。

從第十二章開始進入本書的第二部份,探討較進階的課題,作者更深入探討硬體,特別是特定週邊匯流排的運作原理。第十二章詳細解釋核心對於PCI裝置驅動程式的支援,第十三章檢驗操作USB裝置的API。

有了週邊匯流排的知識之後,就可開始仔細端詳Linux的「裝置模型」(device model),這是核心用來描述它所控管的硬體與軟體資源的抽象層。第十四章從kobject型別開始,從下而上解釋裝置模型的架構,包括裝置模型與真實硬體的整合,然後以這些知識來探討「熱插拔裝置」與電源管理。

第十五章略為離題,探討Linux的記憶體管理。本章示範如何將kernel-space映射到user-space,將user-space映射回kernel-space,以及如何將兩種空間的記憶區映射到device-space(以便進行DMA作業)。對記憶體管理的認識,有助於後續章節的研讀。

第十六章介紹block driver,並點出它們與char driver的主要差異。第十七章探討網路裝置驅動程式。第十八章則是串列驅動程式。

C語言、DMA、IRQ、I/O port等基本知識不可少
要想讀懂本書內容,讀者必須熟悉C語言,而且最好具備基本的Unix操作經驗,因為書中時常提及許多Unix的術語,包括系統呼叫、命令、管線等等。

在硬體知識方面,讀者必須知道一般性的硬體觀念(DMA、IRQ、I/O port),但是本書範例不會用到任何特定的PC裝置。就算談到特殊硬體裝置,本書也會提供所有必要參考資訊。

建構核心需要一些軟體工具(全都是免費的),所以讀者需要這些工具的特定版本。基本上,發行套件(distribution)所提供的工具,應該都是可用的。不過,讀者所用的工具版本,必須要能夠搭配當時的核心。比方說,由於2.6版核心採用新的模組檔案格式,讀者需要新版的module-init-tools套件,舊版的modutils套件就不適用了。

跨越Linux系統程式的門檻
無論讀者的興趣是在核心或user space,我相信本書都很有實用價值,或至少能讓讀者知道核心到底是如何駕馭硬體。本書能激發讀者動手寫程式的慾望,讓這個屬於大家的自由作業系統能夠更好。

會對本書有興趣的讀者,不外乎想要在自己電腦上做實驗,或是工作上需要面對Linux box的深層內核。如果讀者有心成為kernel hacker,但是卻不知從何處下手,這本書應該是一個很好的開始。

《作者簡介》蔡學鏞
清華大學資訊工程碩士,寰震科技技術顧問。曾任華碩集團軟體工程師、元智大學資訊系講師、美商歐萊禮出版社顧問、台灣微軟特約專欄作家。

蔡學鏞曾參與設計清華大學 Java VOD 系統,該系統並獲得第一屆 Java Cup 比賽校園組冠軍。蔡先生著譯有數本 Java 書籍,並在台灣和中國的雜誌開闢技術專欄。

 

熱門新聞

Advertisement