寫給Linux內核初學者

 提供的鏈接讓我發現了很多資源

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

 

寫給像我一樣的Linux內核初學者

                                                         --孔建軍(Kongove.CN)
                                                                     2008.11.12

首先,讓我們來看幾組令人振奮的數據。現在訂閱Linux內核郵件列表[1],每天的郵件流
量大概在500份左右;執行"grep "^P:" MAINTAINERS |sort -u|wc -l",對內核子系統維
護者進行統計,得到的結果是534人;從2007到2008年,平均每天有4300行代碼添加到內核
,有1800行代碼從內核刪除,有1500行代碼被修改[2];內核2.6.27發佈以後,內核開發者
使用腳本統計內核文件(包括空行、註釋),已經超過10,000,000,000行[3]。那麼,有多
少人讀過內核源代碼?又有多少人爲內核開發做過貢獻? ....

看到這些你或許有嘗試一下的衝動,那就從現在開始瘋狂的Hacking吧。下面是我自己學習
中的一些感受,只是一些學方法或建議,希望能對你有所幫助。

首先,得有具備一些基礎知識,如C語言基礎、數據結構、微機原理、網絡基本原理、操作
系統、體系結構等,當然這也和你具體研究內容有關。下來就是習慣英語,儘管有很多優
秀的翻譯資料供參考,儘管有很多出色的國內程序員活躍於郵件列表,但英語溝通是每個
內核開發人員無法繞過的一個檻。英語裏豐富的專業詞彙和廣泛的使用羣體,會成爲溝通
的最佳選擇。如果你的英語自認爲不是很好,那麼我或許能給你一些建議。平時經常查閱
man手冊、wikipaid[4]等在線文檔解決遇到的問題,參與合適的國外郵件列表,參與一些
英文交友社區(如Facebook等),交筆友、IRC頻道及時聊天都是不錯的方法。這些途徑基
本上都是和技術沾邊的,當然也有很多其他方法提高英語水平。

內核的學習,先得對整個有一個全面的認識,瞭解各個核心部分的工作原理。因爲Linux內
核的工作是各個部分緊密配合完成的,各子系統之間的邏輯關係比較複雜。這裏建議讀一
些經典的書,如《Linux內核設計與實現》、《深入理解Linux內核(ULK)》,這樣可以少走
彎路。這些書都有中文翻譯,如果覺得直接看英文有些吃力,可以先看中文,或者中英文
對照着看。這些書都有好幾個版本,針對2.4、2.6內核的都有,可以先看針對2.4版本的,
然後再看針對2.6的。這裏不得不提一本清華的教材《Linux操作系統原理與應用》,這本
書非常適合入門,前面提到的ULK雖然涉及知識全面、講的深入,但對於初學者往往會陷入
知識點的細節當中。這本教材把很多細枝末節省略掉,展現在讀者面前的只有各部分的關
鍵知識塊。同時有大量圖片說明,搞懂這些圖,也就理解了抽象的內部機制。其中每個章
節都附帶一個代碼實例,通過調試這些程序可以加深對知識的理解,把抽象的東西實例化
。你也可以在這本書作者維護的網站內核之旅[5]中,找到更多的實例代碼和相關資料。當
然不排除有更好的入門教材,推薦這本只是我看過比較好的一本。

當你對內核已經有了一個初步的認識以後,你就需要圍繞某一部分進行深入學習了。這樣
纔能有深入的研究,從而做出實用的東西出來。比如網絡設備驅動、內存管理、文件系統
、內核調度、中斷異常、內核同步等。這裏還是得有經典教材的指導,如果你想搞驅動開
發,《Linux設備驅動》是必讀的;如果你想深入內核的網絡部分,《Linux網絡設計與實
現》等等。

在學習內核過程中,源代碼是最好的參考資料,你可以從Linux內核官網[6]下載最新的內
核源碼,也可以選取交老的版本分塊閱讀。內核源碼的閱讀,難就難在整體的一個把握上
,所以建議大家先選取局部核心數據結構、代碼、文件進行分析,如task_struct結構體、
fork.c文件等。在閱讀源碼的同時,結合一些較小的實例程序練習,從而真正理解源碼。
在學習過程中如果遇到問題,最好現查看手頭和網上的資料,實在解決不了,可以去郵件
列表(中文內核郵件列表[7])。

如果在學習內核的同時,你想嘗試參與真正的Linux內核開發,請繼續往下讀。首先了解內
核開發的大牛,搞清楚Linus Torvalds, Andrew Morton, David Miller等主要維護者的工
作內容,如果你想作ARM方面的開發,你還得知道Russell King,你可以通過MAINTAINER文
件瞭解更多子系統的維護者,當然不是全部要了解。其次你得理解內核的命名規則,以及
如何製作和提交補丁。從而熟悉內核開發的現狀和流程,更加有效的跟蹤Linux內核開發,
同時堅定自己的信心。這樣你的工作才能真正進入Linux內核當中。這裏推薦一些資料,內
核文檔(HOWTO、SubmittingPatches、SubmittingDrivers等,都可以從內核源碼
Documentation目錄下找到)、WangCong的內核講座PPT[8]、Linux內核測試指南[9]。

你得學會利用內核Bug的跟蹤系統Bugzilla[10]工作,學會使用Git版本控制工具,理解樹
的概念。使用Git來跟蹤內核的開發,關於Git的使用請閱讀Git的幫助手冊[11]。Git工具
、郵件列表等的使用,其實質是學會溝通,學會合作,學會高效工作。要時刻記着浪費別
人的時間就是謀財害命!

最後一點,也是最重要的一點,高度認真負責。這是參與開源社區最最關鍵的一點。

推薦另一篇必讀的入門文章[12]。

[1] http://vger.kernel.org/vger-lists.html#linux-kernel
[2] http://www.heise-online.co.uk/open/Kernel-Log-More-than-10-million-lines-of-Linux-source-files--/news/111759
[3] http://www.youtube.com/watch?v=L2SED6sewRw
[4] http://en.wikipedia.org
[5] http://www.kerneltravel.net
[6] http://kernel.org
[7] http://wiki.zh-kernel.org/
[8] http://xiyoulinux.cn/speechdoc/kernelspeech-wangcong.ppt
[9] http://www.cnkernel.org/note/tester.tar.bz2.pdf (注意:是個壓縮包,下載後把.pdf後綴去掉)
[10] http://bugzilla.kernel.org
[11] http://www.kernel.org/pub/software/scm/git/docs/
[12] http://xiyoulinux.cn/wiki/index.php?title=內核入門

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章