1. 程式人生 > >推薦一本最接近完美的Linux核心入門教材

推薦一本最接近完美的Linux核心入門教材

其實我認為這本書不僅僅適合作為入門教材,同時也是一部真正算得上是深入理解Linux核心的鳳毛麟角之作;這本書不僅在Linux核心類書籍中出類拔萃,甚至與計算機其他領域的經典鉅著相比也毫不遜色。這本書就是《Linux核心情景分析》(下簡稱《情景分析》)。如果所有關於Linux核心的書籍(不管英文的還是中文的)中存在一本最佳書籍,相信看過《情景分析》的人都會認為非它莫屬了。

《情景分析》是一本好書,而作為一本技術類的好書一般有這樣幾個特點:

l自包含性強

什麼是自包含呢?舉個例子,比如書中詳細介紹了磁碟交換技術,但是僅僅講磁碟交換本身是不夠的,因為磁碟交換還依賴於其他概念,比如記憶體管理,檔案系統,裝置驅動等,如果不具備這些知識,那麼想理解磁碟交換技術幾乎是不可能的。如果把這些磁碟交換相關的技術和概念都集中在同一本書中加以詳解,那麼就可以認為該書在磁碟交換這個概念上是自包含的。可想而知,如果閱讀一本自包含性很差的書,那麼讀者在碰到新知識點時,就不得不經常中斷閱讀轉向其他資料尋找理解該知識點所必需的其他知識點,從而大幅地降低了閱讀效率。

讀者不妨回憶一下自己閱讀程式碼的經歷,當一個模組所依賴的定義大部分都集中在一個檔案時,那麼閱讀該部分程式碼效率是很高的;反之,如果一個檔案大量地引用了外部定義,即與外部耦合較重的情況下,讀這個模組的程式碼無疑是一件痛苦的事,如果不幸該模組依賴的外部模組又和其他模組耦合較重時,那簡直就是個災難。

對於閱讀書本也同樣的道理。遺憾的是,很多Linux核心書籍在自包含方面太欠缺,閱讀這些書往往會使讀者陷於這樣的處境:為了理解書中的某個概念,必須閱讀其他資料理解這個概念;一旦通過其他途徑理解了這個概念後,其實就不需要再看這本書中相關概念的內容了。

l佈局精巧

讀者在開始閱讀《情景分析》前,不妨先看一下它的目錄:



第一章是預備知識暫且不提。第二章講記憶體管理。熟知Linux核心的讀者應該知道,記憶體管理是整個系統的基礎,無論是程序,裝置驅動還是檔案系統,無不依賴於記憶體管理機制,因此記憶體管理理所當然地成為第一個正式介紹的子系統。接下來是中斷,其基礎作用不言自明;然後開始介紹程序及其排程,因為此時程序所依賴的兩大基礎子系統都已介紹完畢,學習程序的入口條件已經具備。

讀者可能已經發現,程序和程序間通訊這兩部分內容並沒有安排在同一章中,既然都是程序相關內容,為什麼部署在不同章呢?原因是程序間通訊有一部分機制還依賴於檔案系統,這就是為什麼程序和程序通訊分開描述的原因,並且在兩者之間插入了第五章檔案系統

。由此可見,作者在內容順序編排上並非隨意為之,而是經過仔細考慮的,正因為有如此細緻周到的安排,才給讀者帶來了良好的閱讀體驗。讀者可以自行瀏覽《Understanding Linux Kernel》的目錄作為對比,高下立判。

在每個章節的正文部分,作者按場景來組織內容和講解,對於每個場景或模組基本上遵循著這樣的套路:概述->程式碼片段->程式碼講解->深入分析。既保證用適量的程式碼充分覆蓋場景,又使人讀來不覺枯燥。

Linux內容龐雜,任何單本著作都不可能,也沒必要覆蓋所有細節,這就要求做到既全面覆蓋,具有較強自包含性,同時在內容上又有疏有密,而不是對所有內容作同等深度的展開,避免篇幅超大而讓讀者陷入文山字海中。《情景分析》安排內容詳略的總體原則可以總結為:書中授之以,使讀者掌握自己之,進而獲得書中未授之

l有作者獨到的看法和評論

以下摘錄若干作者在書中的評論,大家可以先感受一下:

1.

  

2.

3. 

                                                                        

類似於這種捅破窗戶紙,給人以豁然開朗之感的的論述,在書中比比皆是,留待讀者自己慢慢發掘吧。

對照上述幾個標準,《LinuxKernel Development》既不夠自包含,更談不上佈局謀篇,實在不適合入門者,而200多頁的篇幅顯然也難以滿足有一定Linux核心基礎的讀者的胃口,讀者倒不如將其當作Linux核心的學習筆記來使用,在淡忘了某個已經學過的模組原理時,可以翻一下這本書快速恢復印象;備受廣大讀者推崇的《Understanding Linux Kernel》則在自包含方面稍顯不足,並且少有作者個人的解讀;至於那些通篇用於註釋原始碼的書籍,建議還是不要看吧,學習程式碼,最好的資料就是程式碼本身。

在閱讀《情景分析》的過程中,能夠感受到作者不僅在專業方面積累深厚,在寫作方面也極具功力,遠非各種大話精通深入系列的江湖水平所能及。不難發現這兩項能力也為所有好書作者所共有,專業積累的深淺決定了書本是否言之有物,而寫作功力的高低則直接影響讀者對書本內容的理解速度和深度。

如果說《情景分析》有什麼缺點,就是本書出版於2001年,基於Linux 2.4核心版本,而現在最新的核心版本已經到了4.4,後續很多新增的特性,如近年非常流行的Linux容器技術,在當時的核心版本中還沒有引入,因此本書就沒有描述;同時,相當一部分模組的實現和API都發生了較大的變化,書中的有些內容已經不能作為當前版本程式碼閱讀的參考了。但是,對於Linux這樣一個龐然大物,即便經歷了十幾年的變遷,其核心架構和大部分模組實現仍可謂歷久彌新,對於想掌握Linux核心原理而非所有模組細節的讀者而言,只要能夠熟知其核心架構和主要模組的工作原理,其他區域性的修改變動就盡在掌握了。因此,《情景分析》的閱讀價值並未因版本的演進而有絲毫降低,反而提供了一個瞭解老版本和對比新老版本變化的絕佳機會。同時,我們也期待基於新核心版本的同樣優秀的Linux書籍出世

最後提供一些關於閱讀本書的建議:

1.               首先重點閱讀1章預備知識2章儲存管理這兩章,特別是對於不太熟悉X86架構和段式/頁式記憶體管理的讀者。這不僅是因為這兩章奠定了全書的基礎,還在於預備知識這一章雖然篇幅不大,但對Linux的來龍去脈和X86記憶體管理機制的歷史淵源作了詳盡的介紹,使讀者能夠了解到一些核心機制存在的原因和歷史背景,我一直認為要了解一項工程技術,首先要了解的是其作用和起源,然後才能更好地掌握其內部實現;再者,第一章和第二章的開頭部分很少涉及程式碼,主要是作者對歷史和記憶體機制的講解,看起來不會枯燥,同時也可對作者的敘述能力有所領略,不失為閱讀本書的好起點。

2.               關於裝置驅動,8章裝置驅動佔了全書篇幅的約1/4(全書1500多頁),但其覆蓋的內容也只是冰山一角。作者也特別提到:由於裝置的多樣性,裝置驅動是一個需要整本專著的大課題此外,有些裝置的原理和機制就很複製,需要有專著加以介紹。我們既無足夠的篇幅,也缺乏有關的專門知識來深入闡述這些裝置的原理、機制和操作 儘管如此,對於想了解裝置驅動的讀者,8章裝置驅動仍然值得一讀,而且《情景分析》不是一本Linux核心說明書或開發者手冊,而是一本帶領讀者掌握Linux核心原理和了解其背後設計思想的書,作者的一些觀點在其他書中難得一見,可以把第8章看做是裝置驅動的導讀,帶著這章提供的全域性視角去閱讀其他裝置驅動的專著,相信會有一覽眾山小的感覺。

3.               本書前後章節有很強的依賴關係,對於沒怎麼接觸過Linux的讀者建議還是按原文章節順序閱讀,否則直接跳到後續章節閱讀會有寸步難行的感覺;而對於已經熟悉Linux的主體框架,想深入理解某個模組的讀者,大可以按需挑選章節閱讀。