從題目中可以看到,這篇文章是以我讀《Linux內核設計與實現》而想到的其他我讀過的書,所以,這篇文章的主要支撐點是《Linux內核》。
開始讀這本書已經是很久以前的事了,不過,由于時間和精力原因,沒有認真的分析和深入研究這本書所涉及的諸多內容,現在想來,仍舊很是遺憾,直到最近,再次把這本書拿過來閱讀,才勉強可以說是對書中的知識點有了一定的了解,我說的這種了解,遠達不到精通的地步,可能略懂才更適合我。
好吧,首先先簡單的介紹下這本書。這本書的作者是:Robert Love ,相信系統的學習過Linux的朋友都應該知道這個人,可是,很遺憾,我在百度百科里查不到他的介紹。這是一本翻譯過來的書,書的原名叫做《Linux Kernel Development》,我目前看的是第三版,如下圖所示。相對前兩版來說,第三版中增加了幾章非常好的內容,比如,內核數據結構。這本書基于Linux2.6內核展開討論,對實現Linux內核進行了多方面的分析。
**
作者在序言里寫下讀者應該怎么去看這本書,這本書適合的閱讀人群。我在這里也多說幾句吧。其實,開發內核和驅動的人相對來說不多,不過,很多人喜歡Linux系統,想去了解這個系統,當學習到了一個新的高度的時候,就想去深入內核,去感受怎樣實現這個系統,那么,我建議你好好看這本書,絕對是一個不錯的選擇。
**介紹這本書,我從它的內容說起吧。**
## 第一章和第二章
這兩章的內容我們可以在任何一本介紹Linux的書中看到,第一章是對Linux的歷史和發展進行介紹,第二章是教我們怎樣獲取Linux內核源碼。這里我又要多說幾句了,如果,我們用書中的方法,可能你等了好久也獲取不到,因為網絡限制,你連接不到服務器,解決辦法有兩個,最簡單的是搜索別的資源;第二個,如果你會的話,翻墻吧。
## 第三章--進程管理
這一章介紹內核最基本的東西--進程,分析了進程的創建,休眠和銷毀等各個進程聲明周期。這一章的內容不是很難,相信,如果你讀過系統編程之類的書就應該知道在內核中怎么創建和銷毀進程,而這里所說的那兩個函數(fork和wait)是不是很眼熟呢?從這里我想提到兩本書,其中一本也是Robert Love的作品--《Linux系統編程》,如下左圖所示。從名字我們就可以看出,這本書側重點是系統編程,所以,書中所述都是系統調用,是一本不錯的工具書,不過,書中內容簡短,需要更詳細的介紹還是需要看另外一本書--《Unix環境高級編程》,如下右圖所示。這本書讀過的人肯定很多,它很厚,卻很吸引人,如果你想了解更多的系統編程之類的知識,去看看這本書吧。


## 第四章--進程調度
這一章介紹的內容在Linux相關的書中也有介紹,不過不是很多,不過,這一章的內容讓我想起了“很久以前”我學過的一門課--《操作系統》,確實,在那里有介紹關于進程調度和進程調度算法之類的,在《內核設計》這本書中,進程調度的介紹很全面,但是篇幅簡短,也是需要一定的知識儲備,如果你看不懂或是對書中的內容有所疑問的話,建議你看看這本相對簡單的書--《計算機操作系統》,哈哈,沒錯,就是這本教科書,如下圖所示:

## 第五章--系統調用
只看這一章的題目或許你會認為這一章介紹的是系統調用函數,不過,看看書中的內容你就會知道,這里介紹的不是那些接口的調用,畢竟那些太簡單,只要你會用就行。這一章介紹的是系統調用是怎樣實現的。當我們在寫代碼的時候用到系統調用,我們需要傳入相應的參數便可由內核執行,那么這些函數是怎么實現的呢,是怎么被注冊到內核中的呢,我能不能寫系統調用給我或者他人使用呢,那看看這一章吧,絕對會讓你受益匪淺。
## 第六章--內核數據結構
這一章的內容相比前兩版是作者新加入的。這一章里介紹的數據結構包含有鏈表,隊列,紅黑樹等,這里介紹的數據結構比之前我們學過的數據結構難理解,原因有兩個,主要的是作者介紹的不夠詳細,第二個是對原有數據結構加入面向對象的思想。當然,我們也可以參考相應的介紹數據結構的書來重新回顧下書中所說的知識點,這里,我就不推薦太難的了,畢竟我水平有限,也不大看得懂,建議大家看看嚴奶奶的那本《數據結構》,如下圖所示:
**
## 第七章和第八章
這兩章的標題分別叫做中斷和中斷處理,下半部和退后執行的工作。中斷,這個詞我們經常會看到,它是CPU接收硬件發送消息的一種處理,當接收到中斷消息后會通知相應的中斷處理程序執行相應的工作,然而,中斷處理程序可能會有一些耗時的操作,那么這時就需要把響應中斷先執行,也就是CPU通知硬件接收到了硬件所發送的中斷,而把耗時的工作放在以后“有空”的時候執行,一般,這個有空指的就是中斷處理程序返回時。對待這兩章,如果你想深入的研究,就去好好翻翻計算機體系結構相關的書。好吧,這里我也推薦一本比較簡單的書,也是一本我學習過的教科書,哈工大的唐奶奶的書--《計算機組成原理》,如下圖所示:
**
## 第九章和第十章
第九章的標題是內核同步介紹,第十章緊接著上一章,這一章介紹的是內核同步方法。這兩個標題中都提到的是內核同步。關于什么是同步,我在這里就不多做介紹了。正是因為Linux是多線程的操作方式,所以,避免不了存在競爭,然后,我們就需要處理同步。這兩章的篇幅不是很多,但是內容很多,甚至可以說是有點復雜,涉及到多種處理同步的方法,有些方法還很難理解,由此可見作者寫這本書的定位不是沒有基礎的人群,所以,如果你想把這兩章看明白,還是建議你去看看基礎點的書吧。
## 第十一章--定時器和時間管理
我們都知道,CPU存在一個時鐘中斷,它存在一個周期,到了一定的時間后,就會觸發中斷,那么這個是怎樣實現的呢?我們的計算機在右下角會顯示當前的時間,這個又是怎么實現的呢?這一章就是介紹諸如此類的問題,可能我們不常用這些知識點,但是,擴充下自己的知識量也不失為一件快事,所以,這一章的內容我沒有深入的去研究,只是“匆匆”瀏覽了下。
## 第十二章--內存管理
既然這本書名字叫內核,所以,這一章所說的內存管理指的是內核怎樣去管理它使用的那部分內存,這一章中的內容很好,而且較為詳細,一共23頁,建議大家好好學習這一章的內容,看看Linux的設計者是怎么讓內核去管理它所占據的內存的,同時,也為以后的章節打下基礎,例如進程的內存管理。
## 第十三章--虛擬文件系統
你在使用操作系統的時候對于文件系統這個概念可能并不陌生,但是你知道為什么我們可以寫一份代碼可以在幾乎所有不同的文件系統上執行。哈哈,當時我也不清楚,不過,看了這一章的內容后,明白了許多,注意,這里我說的是明白了許多,并不是說“我明白了”。因為,我并沒有去查看實現這些通用系統調用的源碼,我只是明白了為什么可以這樣做,它是怎樣執行的,但是我不懂是怎么實現的。在這本書里并沒有介紹這些通用函數是怎樣實現的,我認為作者是為了節省不必要的篇幅,因為這些內容顯然超出了這本書的主題。
## 第十四章--塊I/O層
什么是塊?我們的計算機中都存在硬盤,硬盤最小的尋址單位叫做扇區,但是在計算機中,計算機對硬盤的尋址是多個扇區(一般是4個),而這多個扇區就被稱作是“塊”。這一章介紹的是內核的IO操作,其中的重點內容是IO調度策略,確實,就像書中說的一樣,如果不存在這樣的一組策略,那么即使是你的IO請求不多,也會使你的計算機性能急劇降低。可見,這些調度策略是多么的重要,所以,這一章的內容需要認真的學習,研究,這么重要的一章篇幅仍舊是不多,所以,需要把這一章弄明白去查一些資料也就顯得很正常了,這里,我沒有什么推薦的書籍,遇到不懂的就開始百度或者谷歌吧,這也是最快的學習方法。
## 第十五章--進程地址空間
第十二章我我介紹了需要好好看看內存管理那一章,因為后面這一章需要那一章的知識,這也體現了內容的呼應。在書內容的開始就介紹了進程,但是沒有多做討論,畢竟開始就不好理解容易讓人失去看這本書的興趣,所以,作者把它放在了這里,其實這樣說可能不太準確,因為如果你認真學習過編程語言,那么當你的程序運行的時候你可以寫出相應的代碼測試進程的每一部分。既然這里說到了編程語言,我再說下語言的事,我喜歡用C,C++,Java寫程序,Java沒看過什么書,因為都是面向對象,所以,不用過多的去學習語言,我建議學習C和C++,看看下面的這兩本書會是不錯的選擇,這兩本書都偏向語言本身,而且都提供了較多的測試代碼,適合語言的初學者。
**注:由于沒有找到一樣大小的圖片,這里貼的很不好看,很是抱歉。。。。。。**


## 第十六章--頁高速緩存和頁回寫
記得上大學的時候看《計算機操作系統》這本書中提到過時間和空間局部性原理的時候用到了緩存,當時也提到了緩存查找用到了TLB(快表),不過,當時只是應付考試記住那些東西就行,現在看這本書的這一章感覺特別親切,因為至少見過那些東西。然而,這一章介紹的內容比大學時候的那些要難的太多,作者在這一章中也費了好多筆墨,對這一章的描述很是清晰,建議應該好好這一章的內容,這是幾乎所有的操作系統都需要實現的東西。
## 第十七章及結尾
十七章以后的內容我就沒再翻了,因為現在還沒到做驅動和內核開發那一步,而后面的那些內容我認為更合適于實戰,所以,后面的內容并沒有去研究了。
好吧,我給出一點讀這本書的建議。不得不說,這本書介紹的內容較難,如果你只打算讀一遍,那么建議你不要花時間了。其實這本書的每一章內容都可以編寫出一本很厚的書,我們通常見到的介紹內核的書一般是一本書介紹一個子系統或者是整合成一本書,不過,那個厚度絕對不比《牛津詞典》薄多少。而《Linux內核設計與實現》這本書僅有335頁,Linux的諸多子系統大多分成了章節或者幾章內容來介紹,而且我們可以看到每一章的內容大多都在20頁左右,可見作者把內容精簡了太多,幾乎可以說是“字字珠璣”。所以,不花大量的時間很難把上面介紹的知識點弄懂,當然,如果你是Linux方面的專家,那么這句話不適合你。還有,由于Linux2.6內核很是龐大,所以,建議大家讀這本書之前先看看簡單的內核版本,我在這里首推0.11版,也就是Linus編寫的第一個Linux系統,簡單易學,而且也完整的包含了Linux的各個子系統。所以,這里我推薦最后一本書《Linux內核設計的藝術》,這本書以Linux0.11內核源碼展開討論,書中源碼配合圖解展開論述,非常適合內核初學者初探內核世界的奧秘,如下圖所示:

說完了這些偏技術性的書之外,再說下Linux入門適合看的書,其實我感覺學習Linux沒有那么難,但是需要你找到一個好方法,最好是有人指導,當然,如果沒能找到人指導你,就看看下面這段話吧.
如果你想知道這個東西是怎么回事,你就去做,去看,去體會。所以,你最好在你的電腦上安裝Linux系統,入門的話建議安裝Ubuntu,非常簡單也非常易用的操作系統。接著,建議你準備一本書--《鳥哥的Linux私房菜之基礎學習篇》,這本書有兩個版本,另一個是《系統運維篇》,開始學習當然是第一個,也就是下左圖所示的這本。這本書的作者是臺灣人,介紹自己原本是Linux菜鳥,現在儼然成為Linux大牛,他以自己學習的經歷和方法教你認識這個操作系統,之后介紹Linux的許多常用命令,看到這時你應該把上面的命令嘗試著敲一遍,做到學為所用。這本書以簡單易懂的方式介紹Linux,教你學習這個系統,個人認為可以算作是入門的經典之作,所以,推薦在這篇文章中。不過,當你拿到這本書的時候可能會感覺很沮喪,因為它實在是太厚了,你可能沒那么多的時間。好吧,我再推薦另外一本書,這本書的作者是印度人,書很薄,我印象中就兩百多頁吧,書的名字叫做《Linux Shell腳本攻略》,雖然看名字似乎是在教你怎么去寫Shell腳本,但是就我看完這本書之后感覺還是挺適合學習Linux常用命令的,所以,入門的話看看這本書也是不錯之選,當然,可能大部分人覺得這本書介紹的內容稍難,這里我講下看這本書的經驗。我看這本書的目的是為了能看懂Shell腳本,Shell腳本其實就是Linux命令的組合再加上一些簡單的語法,我可不打算去寫Shell腳本。所以,這本書里牽扯到腳本編寫的部分,直接略過就行,看懂命令,知道是怎么回事就可以了。個人感覺,絕對是一本好書。如下右圖所示。


最后,我介紹一本我將要看的書--《Unix網絡編程》,相信知道這本書的朋友很多,這是一本介紹網絡編程的經典之作,書分為兩卷,設計的也很好看,如下圖所示。不過,確實需要花費好多時間,因為兩本書都很厚。Unix設計的原則是“一切皆文件”,當你看了一些介紹Linux/Unix的書籍之后,你會明白這句話的道理;不過,還有一句話說的也很好,“一切皆Socket”,這也是形容Unix,Unix最大的特點就是它的網絡行為,所以,學習了“本地”內容之后,去看看Internet吧。

- 前言
- 讀《Linux內核設計與實現》我想到了這些書
- 夢想的啟航,那些年,那些書
- C++和Windows平臺的一些書籍
- java一路走來
- 《Android入門之旅》
- 致我們終將逝去的青春-PHP篇
- 多讀書,讀好書
- 這些年,那些我們一起讀過的代碼
- C++碼農要讀的經典
- 閱讀IT類圖書,能夠收獲什么
- 讀完《大數據時代》的一點兒心得
- 這些日子我讀過的《java編程思想》
- 關于C,看過的一些書
- Android系統深度游
- 《《內存和性能優化》》給我帶來的!
- 「書評」SAP內存計算——HANA
- 書籍記錄了我技術的成長歷程
- 那一年讀過的技術經典書
- 【時間規劃】C/C++發展之路--讀書
- UNIX 環境高級編程之我見
- 游戲開發圖書推薦--我讀過的技術經典圖書
- 自己動手寫操作系統-經典書籍
- 游戲升級之路
- 《SQL Server 2005開發技術大全》分享一本書
- 書,永遠的朋友
- 學生時代的書單
- 追求技術之路 - 那些陪伴我的書籍
- 經典書籍--好書很多,重要的是有個目標,有個規劃
- android系統深入開發
- 這些年一路相伴的書
- 從零開始學
- 這些年我讀過的技術經典圖書(附電子版下載地址)
- 書--益友--從不孤單
- 給自己時間沉淀下來
- 那些支持我學習與工作的良師益友
- 文章千古事、得失寸心知
- 從Linux 驅動到游戲可視化轉行要讀的書
- 那些年,我們一起讀過的《JAVA與模式》
- 往事不堪回首 -- 多讀書
- 我程序人生的啟蒙書
- 一個不喜歡讀書的Javaer的讀書單
- 一本書,讓我走上編程之路
- 程序員讀書的五重天
- 大學那會兒,我讀過的技術經典圖書
- C語言高手進階的三碟小菜和一盤大餐