做為一個過來人,我談談我自己的看法,歡迎大家補充: 首先肯定的一點是:不要一上來就看內核代碼,基本上你會很快被挫敗感打敗。內核正在變得越來越龐大,學習曲線越來越陡峭,當你一無所知的時候冒然進入linux kernel,你會發現處處都是障礙,處處都是大坑,你根本走不下去。最好的方法是把對內核源代碼的熱 ...
做為一個過來人,我談談我自己的看法,歡迎大家補充:
首先肯定的一點是:不要一上來就看內核代碼,基本上你會很快被挫敗感打敗。內核正在變得越來越龐大,學習曲線越來越陡峭,當你一無所知的時候冒然進入linux kernel,你會發現處處都是障礙,處處都是大坑,你根本走不下去。最好的方法是把對內核源代碼的熱情先放在心裡,從基本功開始。
我認為的基本功包括兩個方面:
1、linux的基本操作。內核中的很多設計都是源於應用,你不理解用戶空間的操作,也就不會知道內核空間在乾什麼。這時候,你需要做的就是在自己的電腦上安裝一個GNU/linux操作系統,Debian、Ubuntu什麼的都OK,最好去掉其他的OS,這可以強迫你在linux下進行學習,工作,生活。在這個過程中,你可能需要google檢索一些信息,安裝一些軟體,學習使用這些軟體,理解一些基本的linux的背景知識......如果你想要從事底層的軟體開發,那麼儘量在終端下工作,這樣會讓你和linux kernel更接近一些,從而提供更多關於內核的基礎知識。
2、第二個方面是軟體相關的基礎知識。你最好學習一些軟體的邏輯思維,學習掌握一門語言,當然最好是c語言。掌握其基本的語法和語義,然後在linux環境下進行實際訓練。這裡不得不隆重推出一本經典之作《Unix高級環境編程》,仔細閱讀這本書,然後動手實踐,編寫linux下的小程式,給自己找些樂子。
有了基本功之後,你可以選擇強攻Linux kernel,不過呢我還是建議從一個小的RTOS入手,構建下麵的知識體系:
1、關於OS的基本概念。什麼是進程、什麼是線程,什麼是中斷,什麼是文件系統,什麼是記憶體管理,什麼是上下文,什麼是設備管理等等。
2、關於處理器以及周邊硬體的基礎知識。可以選擇ARM,也可以選擇其他的處理器,主要是從軟體角度來理解一個處理器,知道CPU的基本組成,知道什麼是MMU,TLB,中斷處理流程,匯流排的概念,什麼是指令集等等。這時候,相信你會接觸一些彙編指令,不一定要能寫,但是一定要能讀懂。
上面的階段都沒有接觸Linux內核,但是不要著急,我們馬上就要直面Linux內核了,第一個問題就是選擇什麼版本,不需要太新,但是越早的內核就會越簡單,有助你可以把閱讀linux內核代碼的習慣持續下去。你有幾個選擇:
1、配合《Linux內核完全註釋》來理解0.12內核。我沒有看過這本書,聽說不錯。
2、配合《Linux內核情景分析》來理解2.4內核。當年就是這本書引領我來閱讀內核的,我一直都對其充滿感激之情
3、配合《深入理解linux內核》來理解2.6.10內核。非常好的書,強烈推薦,我基本上閱讀了好幾遍這本書,中文版一遍,英文版3遍,每次都有不同的收穫。
閱讀代碼的過程有些枯燥,可以考慮撰寫實際的驅動程式來調節一下,《Linux設備驅動》是不二之選。
最後,整理一些心得:
1、英語很重要、英語很重要、英語很重要。一定要學好英語,儘量看英文版書籍。
2、多動手,多思考,多總結。如果有機會,把自己的心得整理出來併發布,和其他工程師交流,這個過程可以有助於夯實你對Linux kernel的理解。
3、clone linux stable的代碼倉庫,多讀一讀git log,那是無窮的寶藏;
轉載地址:
http://www.wowotech.net/forum/viewtopic.php?id=5
http://www.wowotech.net/