學習內核的好處很多,在學習過程中不僅可以夯實大量理論基礎,還可以學習到很多編碼慣用法,提升學習能力和分析能力。
但是如果問其如何學習Linux內核,不同的人會給出不同的答案,有的人會告訴你先去看看0.11的內核源碼,有的人則是推薦先看《Linux內核設計與實現》這樣的書,有的人則會說先把內存尋址學懂,然後再開始考慮網絡協議棧和文件系統之類的內容。
Linux內核設計與實現 第二版下載地址: http://www.linuxidc.com/Linux/2011-05/35530.htm
Linux內核設計與實現(原書第3版) 清晰中文PDF 見 http://www.linuxidc.com/Linux/2014-02/96174.htm
如果是以前,我一般都是上面的幾個答案,不過今天的內容並不從這幾個角度去介紹,而是介紹一些我學習過程中的一些小技巧。
在學習內核過程中最容易犯的錯誤,也是非常難掌握的其實是你站在一個什麼樣的高度上去學習。
站什麼樣的高度去學習也與自身的能力相關,所以這個問題其實更多是在新開始學習的學習者感到非常痛苦的一件事。一方面又希望自己能學懂,但是又不知道如何開始入手。
我列舉幾個常見的例子:
(1) 一開始就看源碼,最開始我也做過這種事,內核有什麼都不知道,結果就想著啃0.11的內核,結果很顯然,2天立馬放棄,完全看不懂。
(2) 翻開書從第一頁開始往下啃,如果這本書比較薄還好,如果比較厚,比如《深入Linux內核架構》,那看2天也得放棄。
(3) 不喜歡看目錄,不喜歡快速浏覽,就想著一個一個字眼的往下摳。如果本身有一定基礎,看的時候還不會覺得膩,但是很快就發現,看了半天,什麼都沒有記住。
還有很多類似的問題,這些都是我們平時學習的時候特別容易出現的一些誤區。這些其實都是沒有正確審視自己的能力,胡亂挑選高度導致。
說了半天,這個高度到底是什麼?我這裡給一個我自己的界定:
高度:指切入問題時采取的抽象程度。
語文不好,說的亂七八糟,說的直白一些,也就是說:
高度越高,也就是越偏向於理解各種抽象概念,傾向於構建對整體結構的一個認知,忽略一些不必要細節,不關心技術實現手段。
高度越低,也就是越偏向於對使用技術的選擇,傾向於代碼實現的各個細節,但是前提一般會在某個抽象的概念領域內進行各種細節性的討論。
我們的大腦更傾向於理解抽象的內容,但是在行動時,我們卻更傾向於去把握細節性的內容。結果導致的內容就是,我們總是希望通過學習細節來構造對抽象概念的理解,最後被細節性內容中各種噪聲干擾思緒,產生一種“這東西好難”的錯覺。在理解了這點,那高度對我們的行為有和指導意義也就呼之欲出了?以讀書為例
站的越高,意味著自己看的內容越粗糙,也就是看書的時候不會去逐字逐句的看,而是一個章節一個章節的看,極端的情況就是只看目錄,在這個過程中主要集中精力構建整體結構,對核心的概念進行抽象。這時候學的內容都相對表面,但是好處就是對以後的學習有很強的指導意義,缺點很明顯,會讓人底氣不足,而且在達到一定程度後,很容易到達瓶頸,發覺怎麼看都看不懂了。
站的越低,意味著自己看的內容很細致,看書的時候就是一個個字眼的扣,極端情況就是開始閱讀源碼,去看開源社區的各種問題。但是就像詩句說的,站的越低,也就常有一種“不識廬山真面目,只緣身在此山中”的感覺。這種情況下特別容易被各種細節干擾,例如為什麼要有這些參數,為什麼這裡需要判斷這個條件等等這些細枝末節的問題。
所以個人的心得是從高到低的學習,在一個新的學習階段,應該先多花點時間學習一些概念化的內容,這時候切忌去看具體的實現,而是多考慮如何在大腦中構建各種抽象模型,對整體的架構有所概念了,然後開始學習一些細節性的內容,比如開始看些源碼,摳寫書上的字眼,讀讀一些具體的博客什麼的。
注:在圖中還有一個消化過程,這個過程的主要任務就是將不同的知識點進行串聯,形成一個有粗有細的知識拓撲網絡。
Linux Kernel 的詳細介紹:請點這裡
Linux Kernel 的下載地址:請點這裡