我的Linux核心學習之路
現在回首看看,接觸Linux已經很長時間了。 在大三的時候開始學習Java, 但是一直學Java的話, 感覺有點膩, 就嘗試找點其他東西來學習。 所以當時就選擇學習了Linux。 至於為什麼要學習Linux, 有以下三個原因。
一是我比較喜歡開源的東西, 當時學習Java就是因為它開源, 以後選擇學習Android很大一部分原因也是因為它開源。 現在已經工作了大半年, 每當有搞不懂的問題, 通過翻看原始碼解決了這個問題, 我都會很慶幸自己的選擇。 開源對程式設計師的影響是巨大的。
第二個學習Linux的原因是, 我感覺自己作業系統方面的知識太欠缺了, 因為自己不是科班出身, 大學學的是機電專業,只學過C語言, 所以基礎的東西必須惡補回來。 學習作業系統理論知識有很多途徑, 但是我還是決定選擇一個具體的系統來入手, 那就只能選擇Linux了, 資料和書籍也多, 原始碼也開放, 是學習的不二選擇。 雖然每天都在用Windows, 但是基於Windows學習作業系統那可真是天方夜譚。
Linux才是程式設計師應該真正學習的好東西。 現在Linux越來越火, 在伺服器和嵌入式等領域風生水起, 也讓我堅信學好Linux對自己的職業生涯肯定是有百利而無一害。 也有人勸說我學習這個沒用, 我已經在以前的博文
第三個學習Linux的理由是, 我喜歡它, 想搞清楚他的原理, 而且也願意花時間去研究。 興趣是最好的老師, 只有真正的喜歡一個東西, 才能把它學好, 就像娶個老婆, 你必須愛她, 才能和她一起度過漫長的歲月。 此外, 程式設計師的好奇心是天生的, 要是不弄明白一件事, 就會吃不下飯, 睡不著覺。 沒有好奇心的程式設計師不是真正的程式設計師。
剛開始接觸Linux的時候, 並沒有想學習核心知識, 只是想嘗試著使用它。 所以就讀了一些基礎性的, 偏應用的書籍。 讀的第一本書當然是《鳥哥的Linux私房菜》啦。 網上評論這本書是最適合的“入門級”教材, 但是我感覺很有深度的, 並非僅僅是教你怎樣敲命令列。 它講的全面而且深入, 包括計算機組成原理,各個命令和引數的使用, 如何配置等等, 非常詳盡。 給我最深印象的是檔案系統那一章, 什麼i節點, 超級塊, 檔案系統分割槽, 對於初學者而言高大上的概念都深入的講了一遍, 看的太過癮了。
此後零零散散的學了一些linux相關的知識。 包括看了兄弟連李明老師的linux視訊和傳智播客韓順平老師的linux視訊, 感覺受益匪淺, 在此感謝兩位老師的無私奉獻。 當然要自己學會裝Linux系統, 剛開始在VMware裝的Centos , 此後又在真機上裝的Ubuntu 。 記得當時裝Linux很費勁, 總會出現這樣那樣的問題, 也導致自己很鬱悶, 現在想來真是有點好笑。 但是這都是學習過程中必須承受的痛苦, 只有踏踏實實的一步一步走過來, 沒有什麼捷徑可言。 知識的獲取是艱難的, 任何一點知識的提升,都要付出很多的時間和精力。
一次逛圖書館的偶然的機會, 看到了新設計團隊的《Linux核心設計的藝術》, 讀來很不錯,雖然是以早期的Linux核心版本來講解, 但是結構清晰, 講解清楚, 配有很多插圖, 這些插圖都基本呈現了Linux核心的執行狀態, 真是匠心獨運啊。 書的大部分篇幅講解了Linux核心的啟動過程, 這也是本書和其他書籍不同的地方, 其實把啟動過程弄明白也是一件相當不容易的事情, 因為啟動過程基本上涉及到了核心各個方面的知識。 這本書讀了兩遍, 大三學習java的時候讀了一遍, 畢業之前又讀了一遍。這時候我對自己的評價還是僅僅停留在會使用Linux, 對核心的知識有一個模糊的印象, 雖然知道了一些核心中的概念, 但是對原理知之甚少。
然後我就很苦逼的畢業了, 要上班了。 我做的是Android應用開發的工作, 所以要將重心轉移到Android上來。 這時候是2013年7月, android已經很火了, 市面上很多講解android應用開發的書籍, 不過都是千篇一律, 天下文章一大抄。 有些還是直接翻譯的android的官方文件。 因為android剛出現幾年的時間, 畢竟很多人還沒有學通, 沒有能力自上而下的把android的架構講清楚, 只能寫一些關於四大元件的書籍, 連Framework框架也很少有提及的。 關於學習android, 我看過的最好的一本書是羅生陽的《Android系統原始碼情景分析》, 還有他的專欄部落格《老羅的Android之旅》, 從核心驅動層, 到硬體抽象層, 再到原生服務, 最後到執行時和Java服務, Framework框架。 真是至上而下, 全部搞定。 正是這本書, 促使我繼續學習Linux核心。
以我當時的水平(其實現在水平也不高), 看《Android系統原始碼情景分析》這本書真是太難了, 很多講的都是Linux核心相關的東西。 因為看不懂, 所以下定決心好好學習Linux核心。 其實學習繼續Linux核心也不只是為了深入學習android, 畢竟作業系統的基礎知識對於一個程式設計師是至關重要的, 趁年輕的時候大點基礎, 修煉一下內功, 可能會在以後走的輕鬆些。 因為過一兩年, 隨著工作壓力越來越大, 也隨著精力越來越差, 可能就沒有時間和精力打基礎了, 然後就只能抱著現有的一點知識, 在這個行業苦苦掙扎, 然後抱怨幹程式設計師是吃青春飯的。其實看看很多大牛, 無不是基礎紮實, 內功深厚的人。 所以很多人抱怨幹程式設計師沒什麼發展, 其實很大一部分原因是自己沒有努力, 沒有努力打基礎, 練內功。 以至於讓自己在漫長的職業生涯中抱殘守缺, 然後逐漸被淘汰。 為了讓自己避免陷入這一困境, 所以要讓自己在年輕的時候打好基礎。
從畢業到現在, 看了很多Linux核心的經典書籍。 最先看的是毛德操教授的《Linux核心原始碼情景分析》, 只看了上冊, 只能說是囫圇吞棗過了一篇, 對核心中的一些概念有了更深“一點”的瞭解, 還稱不上理解。 再加上這邊書是以原始碼驅動的, 對於我這種菜鳥當然是不可能完全理解的。 我也知道自己不可能理解, 但是為什麼還要去讀呢?我認為不能每天都讀自己已經懂得的東西,寫自己已經寫了N遍的程式碼。 因為總是做自己熟悉的東西, 是沒有什麼進步可言的, 必要的時候必須讓自己忍著壓力和痛苦, 去學習一些比較難的知識。 學一遍學不懂就學第二遍, 再學不懂就學第三遍, 總有一天會搞明白。
看完毛教授的書, 感覺對核心的很多概念還是很模糊。 沒關係 , 繼續學習。 然後又讀了《Linux核心設計及實現》,這本書不是大部頭, 也講的不是很深入, 對我來說很適合, 然後讀了這本書。 然後又買了《深入理解Linux核心》, 接著讀, 讀完之後又買了《深入Linux核心架構》, 這兩本書都是很有深度的, 可以說是大而全的書。 我以為讀了之後會有很大的進步, 但是我想錯了, 其實只有很小的進步。 然後自信心有點受挫。 尤其是看《深入Linux核心架構》,但是我再出差, 每天加班到晚上十點多, 回到賓館已經快十一點了, 回去後就抱著書看, 每天都一兩點睡覺, 然後第二天還得八點半上班。 感覺自己付出了這麼多的努力, 然後就得到了少的可憐的回報 , 感覺心裡挺難受的。 所以就先把Linux擱置起來了, 可能是我太心急了, 需要平靜一段時間。
在這最近一個多月的時間了, 我沒有再啃Linux核心, 而是學了點Python , 學了一些Go語言, 看了看設計模式。 但是我知道自己一直沒有放棄Linux核心。 縱然它虐我千百遍, 我卻待它如初戀。 兩週之前, 我有把以前讀過的《Linux核心設計及實現》拿過來重讀, 這次再讀, 就明顯感覺輕鬆了很多, 很多概念也熟悉了, 可以說理解的都差不多了, 對整個核心的執行機制有了更深的理解。 以前讀這本書痛苦的要死, 現在一個多星期就讀完了, 是完完整整的讀完, 並且大部分內容都能理解的差不多。 這種感覺還是很好的。 其實真正完完整整的讀完一本書,並且理解它講的大部分內容, 是一件相當難的事。比如, 有人寫了10年的Java程式碼, 給他一本《Java程式設計思想》, 他也不一定能全部看明白。 我也是在讀完這本書之後, 感覺心情不錯, 才想起寫這篇部落格, 記錄下來這一個還算有意義的時刻, 在這裡將這本書的封面記下來(該圖片來自百度搜索):
到目前為止, 對於Linux核心, 我給自己的評價是 : 入門了 。 對於核心中的概念有了比較深刻的理解, 對大部分的原理也理解了, 對核心中如程序管理, 記憶體管理, 系統呼叫, 檔案系統等的實現也有一定的瞭解。 但是我還會繼續學習, 繼續讀《Linux核心原始碼情景分析》, 繼續讀《深入理解Linux核心》, 繼續讀《深入Linux核心架構》。 但是在繼續學習的時候, 要儘量做到下面兩條:
1 儘量多讀原始碼。 之前也讀過原始碼, 但還算讀的不多, 主要還是以讀書為主。
2 儘量把自己掌握的知識寫下來, 寫成部落格的形式。 寫部落格會讓人進步很快。 其實關於Linux核心的知識, 早就想寫一寫了, 無奈腹中空空, 水平有限, 確實寫不出來。
寫到這裡, 我目前所走的Linux學習之路就寫完了。 你看, 人生是多麼的艱難, 折騰了這麼長時間, 才剛剛入門而已。 但是又有什麼辦法呢? 希望付出的越多, 遲早一天會有豐厚的回報。