Linux 內核學習的經典書籍及途徑?


說說我們以前的培訓經驗。先看Unix內核相關的書籍,了解內核的經典實現方法,然後再結合源碼去研究Linux內核。這樣做的原因是避免從一開始就陷入細節。

內核重點關注這幾個部分:進程管理及調度,內存管理,文件及文件系統,Cache,I/O,SMP(多CPU)。

Unix內核推薦很老的一本書《UNIX操作系統設計》,英文原版的叫做《The Design of The UNIX Operating System》。重點關注這些章節(我手上拿的是英文版的):

進程管理及調度:

  • The Structure of Processes
  • Process Control
  • Precess Scheduling and Time

內存管理:

  • Memory Management Policies

文件及文件系統:

  • The Buffer Cache
  • Internal Representation of Files
  • System Calls for the File System

Linux內核就看那本經典的基於2.6版寫的書《深入理解Linux內核》。這本書相當的枯燥,最好結合實際的代碼看,可以了解它們是如何實現的。給幾個建議先:

  • 細看的時候,不用按章節的順序去看,而是最好是從點到面,先了解一些基本的實現方法,再去結合代碼把這些點穿起來。重點關注這些:進程(包括管理和調度),地址空間,內存管理,文件及VFS,Page Cache(頁高速緩存),PFRA,I/O及設備驅動等等。

  • 積極的去探索一些書上沒有詳細說明,但是內核中又實現了的;或者是那些內核代碼已經有很大改變的部分。例如:電梯演算法(CFQ,紅黑樹),通用Block層的I/O請求隊列和調度,基於VFS之上的具體文件系統的實現(如ext2/3,YAFFS),頁從分配到回收的整個過程,設備驅動的具體實現(如USB,存儲設備)等等。
  • 自己畫圖、作筆記,把重要知識點用自己能理解的方式全部記錄下來,因為如果你不用,也許半年之後就忘的都差不多了。有一些簡單的圖片和筆記往往能快速的回憶起來。

這幾本書作為輔助也相當的棒:《Linux設備驅動程序》,《深入理解計算機系統》,《Professional Linux Kernel Architecture》,還有相當經典的fudan_abc寫的那一套Linux內核代碼分析。

不過在做所有的這些之前,請把C語言學好,並且去了解一些簡單的Shell的語法。推薦一本Shell的書籍:《UNIX Shells by Example, 4th Edition》。


關於內核學習我建議不要上來就讀內核而是先了解內核的構成和特性,然後通過思考發現疑問這時再去讀內核源碼。即先了解概貌在讀局部細節。而且內核分成好多部分,不要只是按照順序去讀,應該針對某一部分比如內存管理或進程管理橫向讀幾本書,這樣可以理解很全面。

Linux Kernel 四庫全書

1. Linux內核設計與實現 Edition 2 2. Linux設備驅動 Edition 3 3. Linux內核源代碼情景分析 4. 深入理解Linux內核(第三版)

1.《Linux內核設計與實現》

本書重在原理。適合入門的最佳圖書。作者是為2.6內核加入了搶佔的人,對調度部分非常精通,而調度是整個系統的核心,因此本書是很權威的。

2.《深入理解Linux內核》

此書比上一本多了些細節。是Linux內核黑客在推薦圖書時的首選。寫的比較簡單易懂,適合剛剛接觸LINUX內核的。 此書圖表很多,形象地給出了關鍵數據結構的定義,與《Linux內核源代碼情景分析》相比,本書內容緊湊,不會一個問題講解動輒上百頁,有提綱挈領的功用,但是深度上要遜於《Linux內核源代碼情景分析》。

3.《LINUX設備驅動程序(第3版)》

這書強調動手實踐!但它是講解「設備驅動」的,不是最核心的東西,而且有些東西沒硬體的話無法實踐,可能更適合驅動開發的程序員吧

其中關於同步與互斥、內存分配的部分,感覺很不錯。

4.《Linux內核源代碼情景分析》

書很好,很經典,是浙大教授毛德操寫的,可惜成書於2001年之後一直沒有更新。分上下冊。

很多是基於2.4內核講解的需要注意。如果學習的話也建議學習2.6,2.6跟2.4比發生了很多顯著改善,應該學習的。

全書內容博大精深,不是非常好懂,對細節問題描述比較清晰。但是感覺對內核的整體感覺不夠強。另外缺少網路部分的分析。覺得不是很適合初學者。 上冊講解內存管理、中斷、異常與系統調用、進程式控制制、文件系統與傳統Unix IPC;下冊講解socket、設備驅動、SMP和引導。

本書基於Intel IA32體系,由於厚度大,很多體系上的知識都捎帶講解了,所以如果你想深入了解內核的工作機制而又不非常熟悉Intel CPU的體系構造,本書是最合適的。

這本書可以結合陳莉君老師的《深入分析Linux內核源代碼》,這本書也是2.4內核的,網上可以下載

作者: 陳莉君 出版社: 人民郵電出版社 出版年: 2002-8 頁數: 531 ISBN: 9787115105257

說明:陳老師是上述《深入理解Linux內核》和《Linux內核設計與實現》的作者,曾通讀過linux的所有代碼。

==================擴充閱讀==================

5.《Linux內核源代碼分析》

作者: (美)Scott Maxwell 譯者: 馮銳/邢飛/等 出版社: 機械工業出版社 出版年: 2000-06 頁數: 633 ISBN: 9787111080923

點評:面對中高級,這本書很好,對了解操作系統是一本不可多得的好書。

6. 《LINUX KERNEL技術手冊》

參考手冊,很薄,值得一看。

7.《深入Linux內核架構》

這本書針對的是比較新的內核版本2.6.24;內容比較全面,深入淺出。

如果沒有對Linux內核的初步結構的認識,那麼會看得比較吃力。 建議可以一邊去翻在國內已經聞名已經久的四本Linux內核著作(《Linux內核原代碼情景分析》、《Linux內核設計與實現》、《深入理解Linux內核》、《Linux設備驅動程序》),再一邊看這本書,把這本書當作一個補充或者當作一個內核框架圖譜說明書來閱讀,收效會更好。

8.《Linux內核完全注釋》

此書出自同濟一個博士--趙炯。 主要描述和注釋了Linux 0.11內核全部源代碼。對於初學Linux內核操作系統的人來講,該書能夠引領讀者快速入門,並且能全面了解一個簡單操作系統的工作機理。對於進一步學習現在的Linux內核具有非常大的指導作用。對於學習嵌入式應用的技術人員來講,通過《完全注釋》一書的學習也能迅速融入嵌入式應用領域。同樣,該書也能作為閱讀現代Linux內核源代碼的一本參考手冊使用。由於該書是對代碼逐條進行注釋的,因此也能作為深入學習C語言編程的參考書。另外,該書不僅配備有完整的Linux 0.11系統試驗環境,而且本人還在一年前就在網上專門建立了一個針對該書的網站「www.oldlinux.org」,專門開闢了一個討論該書所涉及的Linux內核實現的論壇。目前該網站的內容已經被權威Linux內核發布網站http://www.kernel.org全部作了鏡像(http://mirrors.kernel.org)。

http://oldlinux.org/index_cn.html

網站宗旨:

收集Linux從醞釀到開發初始版本有關的所有資料和信息(1991-1995);

重新建立起最古老的Linux可運行系統,這些系統在其它地方很難再找到了;

為初學者提供一個學習Linux內核基本工作原理的最簡單方法。

本書新版:《Linux內核完全剖析--基於0.12內核》

2009年出的,很厚。

===============自製操作系統系列==================

9.《Orange S:一個操作系統的實現》

作者:於淵

出版社: 電子工業出版社; 第1版 (2009年6月1日)

本書第一版2005年出版,這是第二版。

從只有二十行的引導扇區代碼出發,一步一步地向讀者呈現一個操作系統框架的完成過程。

10.《30天自製操作系統

作者: (日)川合秀實 [作譯者介紹] 譯者: 周自恆 李黎明 曾祥江 張文旭 叢書名: 圖靈程序設計叢書 出版社:人民郵電出版社 ISBN:9787115287960

點評:小日本寫的,不過確實寫的內容很好,講怎麼自己一步步寫操作系統,從彙編到C都有涉及。

_________________________________________________________________________

unix是Linux的基礎,學習linux也要看unix

Unix的絕版好書

UNIX操作系統設計

原書名:The Design of the UNIX Operating System 作者: (美)Maurice J.Bach 譯者: 陳葆鈺 王旭 柳純錄 馮雪山 叢書名: 計算機科學叢書 出版社:機械工業出版社 ISBN:9787111373971

點評:當年linux之父參考過,非常經典,無需多言

----------------------------------------------------------

UNIX編程環境

原書名:The UNIX Programming Environment

作者: Brianw.Kernighan 譯者: 陳向群 叢書名: 計算機科學叢書 出版社:機械工業出版社

點評:非常好的入門書.書中絕無生僻的角落,對於入門來說沒有什麼難以理解的。但是字裡行間浸透了作者設計unix的指導思想,這一點是別的入門書無法企及的。 書中提及的點滴都是實用的方法和準則,而這些充斥著在unix上一整天的工作,即使是有經驗的用戶學過此書後工作效率也會提升。

UNIX高級教程系統技術內幕

作者: (美)Uresh Vahalia 譯者: 聊鴻斌/等 出版社: 清華大學出版社 出版年: 1999-05 點評:老書,有電子版。linux/unix的頂級寶貝!

補充:

評論區知友

@逸文奧特曼 推薦一本《 操作系統真象還原 》

作者:鄭剛

出版社: 人民郵電出版社

出版年:2016-03

點評: 用詼諧幽默語言講述的深入理解操作系統原理的精品 輕鬆自製操作系統 操作系統並不深奧 本書給予全新解讀


你想更深入了解學習Linux知識體系,你可以看一下我們花費了一個多月整理了上百小時的幾百個知識點體系內容:

【超全整理】《Linux雲計算從入門到精通》系列實戰筆記全放送


最近半年花了一些時間研究內核,分享一下我自己的經驗,僅供參考。

必讀的好書,絕對絕對受益匪淺

  1. 《深入理解Linux內核 - 第三版》《O"Reilly:深入理解LINUX內核(第3版)(涵蓋2.6版)》([美]博韋,西斯特)【摘要 書評 試讀】雖然基於的是Linux 2.6的內核,但是2.6算是Linux內核的一個重要轉折點,最重要的改進都是從這個版本開始的。
  2. 《Linux內核設計與實現》《Linux內核設計與實現(原書第3版)》([美]Robert Love)【摘要 書評 試讀】這本書可以配合前面一本來讀,語言和知識點都很精鍊,但是,需要對內核有一點了解,例如作者在前面幾張就提到了slab,但是在深入內核裡面,要到後面才講,提到的時候,如果你不懂,Google之深入了解頁是不錯的方案。這本書很薄,絕對有助於你對內核有一個框架性的了解

我是反覆讀了上面兩本書2到3遍,但是還是覺得不夠,有時間的時候還是會隨機翻翻。

接下來,我覺得很重要的需要去做的,就是根據書里了解到的內容有針對性的研究。

例如,書上的例子不足以讓我對邏輯地址-線性地址-物理地址的轉換,分段-頁表等的了解還不夠,我Google搜索研究了GDT (雖然Linux的分段已經無意義,但是了解還是好的),看了stackoverflow還有別人博客很多帖子和討論;單獨找資料研究了VMS還有內存管理,研究頁表,進程如何保存和恢復頁表,頁表的作用,TLB的作用等等。

Linux內核,最重要幾塊:進程管理和調度(讓你如何深刻的了解到,線程為啥就是一個進程,調度的是task以及task的關鍵數據結構);內存管理,了解虛擬內存的妙處,用自己的視角去看連續地址的虛擬內存以後背後如何轉換到物理內存的zone還有頁框;文件管理,看看內核是如何解決各種文件系統的接入的(讀了那麼多面向對象模式,內核的VFS就是一個經典的實例);設備管理,以及中斷。硬中斷,軟中斷,軟體中斷,我是TMD第一次懂了。

同時了解內核里一系列的緩存(例如,解決外不碎片的buddy system,解決內部碎片的slab分配器)。

最後,我去quora上關注了 Rober Loverhttps://www.quora.com/profile/Robert-Love-1,看完了大神所有的回答。我是平生第一次真切的體會到,唉,大牛的三言兩語,我是懂了。

另外,其間因為一些內核問題,還翻完了 《Linux設備驅動》《O"Reilly:LINUX設備驅動程序(第3版)》([美]科波特(Corbet,J.),等)【摘要 書評 試讀】《Linux系統編程》,也值得推薦。

===========================

感興趣的可以關注我的微信公眾號,感謝

http://weixin.qq.com/r/tDhudnrENSdKrT4V922m (二維碼自動識別)


Understand the Linux Kernel, 但是建議閱讀之前自己仔細研究kernel的build系統,以及EFL文件格式。


關鍵詞

趙炯;Linux內核完全剖析;0.11;

簡介

網上有很多他這本PDF著作,當然啦,最推薦買一本,說實話,大學裡這麼多本書,這本是我覺得拿起來和放下都覺得有收穫的一本;話說我們做坑爹操作系統多半靠這本大書了;

歪評

參加工作了研究內核機會很少,編譯、升級內核機會倒是很多。。常用系統命令掌握了似乎也夠了

至於鳥哥嘛,大家都推薦,一開始看他的網站覺得他挺厲害的,可能是書的語言偏台灣風、內容也有點舊吧,可能不如內核完全剖析吸引人,看一段懂一段來得痛快。咳嗽,純個人意見。


1.拋棄翻譯教材。

2.linux源碼樹中的Documentation文件夾

3.最好先看深入理解計算機系統(CSAPP)

4.C語言過硬

5.從驅動入手。自己編譯內核,動態載入驅動。linux device driver 第三版

6.Understanding linux kernel(這本有點老了)

7.Robert Love的兩本書。。一個講api的,一本linux kernel development第三版


我是根據樓上的帖子,然後迅速買了一本Robert love的《linux內核設計與實現》。覺得這本用來入門真的是很不錯,比較通俗易懂。不像深入理解linux內核,直接看可能會覺得枯燥和有點難懂(俺看得心都碎了!),然後配合源碼和自己改寫,相信會好很多。

而且,我發現結合著lkd這本書看,然後再弄源碼,會很有效果。要不只見樹木不見森林。鳥哥那本私房菜固然好,但是是教你怎麼用linux系統的。我拿來當工具書用:)

這個問題是個好帖子,我受益很多,先謝謝啦~

----------------------------------------------------------------------------------------------

分享一本書《深入分析linux內核源碼》http://www.eefocus.com/html/09-06/415503100652pERV.shtml。


書籍可以選擇《Linux內核設計與實現》、《Linux內核源代碼情景分析》、《深入理解Linux內核》等,使用Source Navigator或者其它內核閱讀工具讀內核代碼,嘗試自己編譯內核。

參考:關於Linux內核學習的誤區以及相關書籍介紹

http://www.hzlitai.com.cn/article/ARM9-article/system/1605.html


這是我的內核學習路徑ヽ(ー_ー )ノ,從大二下學期到現在所看的書僅供參考,目前在看2.4版本內核

王爽彙編語言(教會16位masm彙編)

x86從實模式到保護模式(了解保護模式)

一個操作系統的實現(幾千行代碼的簡單內核)

linux內核設計與實現(很薄,有一個全局觀)。

深入分析linux內核源代碼(源碼講解不多,概念實現很多)

linux內核情景分析(大段linux2.4內核源碼分析)

END


深入Linux內核架構》和Linux內核源代碼包里的文檔。


可以看下中科大孟寧老師的MOOC課程《Linux內核分析》。

這門課從理解計算機硬體的核心工作機制和用戶態程序如何通過系統調用陷入內核入手,通過上下兩個方向雙向夾擊的策略,並利用實際可運行程序的反彙編代碼從實踐的角度理解操作系統內核,然後開始分析Linux內核源代碼,從系統調用陷入內核,進程調度與進程切換,最後返回到用戶態進程。

實驗樓為這門MOOC提供了配套的在線Linux實驗環境,理論結合實踐才能抓住Linux內核的精髓。

Linux內核的配套實驗:Linux內核分析

Linux學習路徑: Linux研發工程師學習路徑

實驗環境:


不要看中文版的 《深入理解linux內核》


0.Kernighan的&<&&>和他的&<&&>

1.萊昂氏的&<&<萊昂氏UNIX源代碼分析&>&>,巴赫的&<&&>

2. 國內出的分析早期內核的&<&&>

3. 內核源碼樹里列了大部分比較經典的內核和驅動的書


推薦《追蹤Linxu TCP IP代碼運行》這本書,從實踐出發;從tcp/ip逐漸擴展到虛擬文件系統,進程管理,內核啟動等。

目前正在研究這塊,有興趣的可以一起交流:

http://blog.chinaunix.net/space.php?uid=22359610


Kernel是好多年前看的了,印象最深刻的還是Robert Love的Linux Kernel Development。思路條理十分清楚,講得非常到點,體現出作者功力不俗。看過這本開竅後,自己翻代碼或者看其他材料都清晰很多。


有關內核的書籍可以用汗牛充棟來形容,不過只有一些經典的神作經住了考驗。首先是5本久經考驗的神作(個人概括為「2+1+2」,第一個2是指2本全面講解內核的書,中間的1指1本講解驅動開發的書,後面的2則指2本有關內核具體子系統的書,你是否想到了某某廣告里三個人突然站起單臂齊舉高呼「1比1比1」的場景?)。

《Linux內核設計與實現》

簡稱LKD,從入門開始,介紹了諸如進程管理、系統調用、中斷和中斷處理程序、內核同步、時間管理、內存管理、地址空間、調試技術等方面,內容比較淺顯易懂,個人認為是內核新人首先必讀的書籍。新人得有此書,足矣!
《深入理解Linux內核》

簡稱ULK,相比於LKD的內容不夠深入、覆蓋面不廣,ULK要深入全面得多。
前面這兩本,一本提綱挈領,一本全面深入。

《Linux設備驅動程序》

簡稱LDD,驅動開發者都要人手一本了。

《深入理解Linux虛擬內存管理》

簡稱LVMM,是一本介紹Linux虛擬內存管理機制的書。如果你希望深入的研究Linux的內存管理子系統,仔細的研讀這本書無疑是最好的選擇。

《深入理解LINUX網路內幕》

一本講解網路子系統實現的書,通過這本書,我們可以了解到Linux內核是如何實現複雜的網路功能的。

這5本書各有側重,正如下面的圖所展示的那樣,恰好代表了個人一直主張的內核學習方法:首先通過LKD或ULK了解內核的設計實現特點,對內核有個整體全局的認識和理解,然後可分為兩個岔路,如果從事驅動開發,則鑽研LDD,如果希望對內核不是泛泛而談而是有更深入的理解,則可以選擇一個自己感興趣的子系統,仔細分析它的代碼,不懂的地方就通過社區、郵件列表或者直接發Email給maintainer請教等途徑弄懂,切勿得過且過,這樣分析下來,對同步、中斷等等內核的很多機制也同樣會非常了解,俗話說的一通則百通就是這個道理。當然,如果你選擇研究的是內存管理或者網路,則可以有上面的兩本書可以學習,如果是其他子系統,可能就沒有這麼好的運氣了。


如果決定學習了,可以看看這個,對理解內核的調用流很有幫助。

GitHub - vonnyfly/kernel_visualization: Automaticly draw callgraphs for Linux/Solaris/FreeBSD kernel functions


假設要學習Linux的人有一定的編程經驗,個人學習的步驟如下(以下書籍是本人看的,不代表就是最好的,只是做參考):

1. data structures. 書目:Data Structures Algorithms in C++, 2nd Ed.+csdn網站里牛人的個人理解+ SFU cmpt225筆記(http://www.cs.sfu.ca/CourseCentral/225/ahadjkho/)。這部分知識吧,個人覺得主要還是理解,你說非要自己寫個2叉樹庫啥的,其實也沒太大必要。因為linux裡面那些比如linked list,還有task queue的紅黑樹啥的這些數據結構,人家都給你包裝好了,調API就可以了。如果是初步學習linux,這些細節可以放到後面, 先把整體的東西把握了。

2. 編譯及計算機原理。書目:程序員的自我修養-鏈接裝載與庫 + Computer Systems:A Programmers Perspective。注意這塊如果只看這兩本書,效果可能不是最好的,最好就是從邏輯門開始學,由淺入深,最後到CPU的基本組成,微指令的基本設計。之後可以找個FPGA的軟體,自己模擬個極為簡單的CPU,加深理解。之後再8051或者arm上面寫點彙編,裸機程序什麼的。

3. 操作系統相關知識。書目:Operating System Concepts 9th Ed,+csdn相關的一些網頁。POSIX的東西,實時操作系統的東西要懂些,因為linux是個soft real time的OS,裡面有一些real time
task的東西。linux user space編程也要有些經歷,shell也要會用。這些都是準備工作,都得會,kernel才好學。

4. Linux內核相關知識:professional linux kernel architecture,understanding the linux kernel。本人目前在看第一本,個人感覺得多做筆記,注重數據結構件的關係,第一遍看的話就這麼看,吧整體把握好,之後第二遍第三遍再深入。

5. Linux驅動相關知識:Linux deivce driver。這本本人沒有全部看過,看過需要用的部分,不太好評價。

待續。。。

以上是個人感覺學習的一個順序,我是電子工程專業出身,學習電子工程的順序基本上也是這個順序,linux內核太複雜,涉及的東西太多, 能夠學習到的深度,取決於工程師整體的知識修養水平。

以上書籍推薦還是中英文各弄一本,有時候英文書里有錯,中文對照一下,如果感覺還是不對,就csdn裡面查查,網上找找資料。


Operating Systems: Design and Implementation


其實CSAPP這本書也很不錯,以linux為例,可以作為學習操作系統、軟硬體基本原理的通識書。


推薦閱讀:

怎樣進入學習狀態?
為什麼有些人可以一邊聽音樂一邊高效學習?
如何自學資料庫?
如何提升自己的學習能力?
是否真的有天道酬勤?

TAG:Linux | 學習方法 | 專業書籍推薦 |