1. 程式人生 > >Linux內核“問題門” - 學習問題、經驗集錦

Linux內核“問題門” - 學習問題、經驗集錦

還在 精華 那些事 努力 深入 inux body 現在 那些事兒

陳憲章說:“學貴有疑,小疑則小進,大疑則大進。疑者,覺悟之機也,一番覺悟一番長進。”

培根說:“多問的人將多得。”

還在學校的時候導師在激情講演之後對著會議室裏形態各異但均靜默不語的我們痛心疾首的說:“會提問題很重要啊,同誌們!不會提問題怎麽有資格做研究!”

這樣鏗鏘有力的訓誡今日想起仍覺深受刺激,於是就要不可避免得要做出一些反應來。不過一是因為咱這年代還沒有非主流的說法,二是因為也沒有馮仰妍同學的性別優勢,不可能受到刺激就整出個門來。咱能夠做到的最大反應也就是在這裏開貼專門探討探討內核學習的相關問題,為了稍微增加那麽一些廣告效應,就稱為“問題門”吧。

使用“問題門”的稱呼,一是內心裏潛藏的那點低級趣味想去沾點近些年層出不窮各種各樣的“門”的仙氣,二是在內核的學習過程中的確實實在在的存在著這樣的一個“門”,橫亙在我們的面前,跨過去便海闊天空是另一番世界,但卻是讓無數人競折腰,百思不得其鑰匙。

另外,這個“問題門”也算是為拙作《Linux內核修煉之道》制作的一個小插曲,以感謝精華篇發布過程中很多朋友的關心與支持,希望通過對大家內核學習過程中遇到的問題與經驗心得做一番展示,來幫助還在門外的朋友尋找到這扇門的鑰匙。

我先對網友提出最多的問題進行解答,“拋磚引玉”,來作為這個“問題門”的雛形,大家也可以在評論裏提出自己的問題和分享自己的學習心得,我會及時地對其進行整理匯總,大家一起將“問題門”逐步完善,幫助後來者和有需要地人不再為“入門”而苦惱。你的問題可能被收錄到我的新書中! 希望這是一篇能夠成長得文章!

提出你的問題,不要“陪公子讀書”,祝早日“入門”!

2010329日更新

問題門6回:研究內核源碼的切入點在哪裏,或者說從哪個模塊開始研究對新手比較適合,是否有一些必讀的基礎型的模塊源代碼?(Roger_jin提出)

fudan_abc的回答:

沒有那些所謂的必讀的基礎性源代碼,呵呵,只要按照韓峰同誌的那種態度去分析選定部分的源代碼,那些所謂基礎性的東東都會在分析過程中明白理解的。有上下文的幫助,反而會更容易理解那些之前理解不了的“基礎知識”。

至於切入點,沒有什麽特別的推薦,主要是依賴自己的興趣或者開發需要了。

2010年3月24日更新

“問題門”第5回:學習Linux內核,應該從Linux哪個版本代碼開始閱讀更好呢?

fudan_abc的回答:

個人建議從新的內核開始,固然新內核的代碼非常龐大,但並沒有說非要求大求全,追求每個部分都要理解。

學內核忌諱求大而全,如果對哪部分比較感興趣,研究相關的源碼和change就行了,當然仁者見仁智者見智,自己如果覺得從低版本開始更好更適合,那采用這種方式也未嘗不可,畢竟各人的路還是各自走的。

2010年3月23日更新

“問題門”第3回:通常,語言及其庫的學習分為幾個層次,1.熟練使用,2.閱讀源碼,了解實現原理,3.對源碼進行擴展。那麽linux kernel怎麽劃分層次,每個層次如何達到?(hust_tulip提出)

fudan_abc的回答:

問題中的三個層次對應到linux內核的學習上:“熟練使用”就是要能夠熟練的使用linux系統;“閱讀源碼”就是指“學習內核就是學習內核源代碼”,必須勇敢的去學習內核源碼;“對源碼進行擴展”可以對應於融入內核社區,參與內核的開發。

這也正好在一定程度上鍥合了本書前言裏對內核學習劃分的幾個層次:全面了解抓基本,興趣導向深鉆研;融入社區做貢獻,堅持堅持再堅持。

——詳見修煉之道 之 前言

“問題門”第4回:每個層次的學習都有什麽對應的參考資料以及網絡資源?(hust_tulip提出)

fudan_abc的回答:

首先是“全面了解抓基本”,這個層次,最好的書自然就是lkd和ulk了,這兩本書,一本提綱挈領,一本全面深入,都能很好的幫助全面的理解內核的整體機制。新人的話,一本lkd就足亦了。

第二個層次“興趣導向深鉆研”,這個層次就是要以內核源碼為中心,選擇內核中一個自己感興趣的部分,以韓峰同誌對待日記的態度,嚴謹而細致的仔細分析它的代碼,不懂的地方就通過社區、郵件列表或者直接發Email給maintainer請教等途徑弄懂,切勿得過且過。至於這個層次的參考書麽,網絡子系統的有《深入理解LINUX網絡內幕》,內存管理的有《深入理解Linux虛擬內存管理》,推薦看英文版,呵呵,usb的可以看我們的《Linux那些事兒》,其它子系統的還沒註意到有什麽專門講解的,不過內核源碼本身就是最好的參考資料了。

至於第三個層次“融入社區做貢獻”,就是要努力融入到內核的開發社區,經過前兩個層次的修煉,此時你已經不會再是社區中潛水小白的角色,而是會針對某個問題發表自己的見解。可以嘗試參與到內核的開發中去。相關資源有很多,詳細可以參考修煉之道精華篇的(9)內核學習資源

最後一層就是堅持了,不管遇到什麽挫折都不放棄,就像咱們的袁教授不管遭受到什麽樣的辱罵都要堅持不斷的發瘋一樣,有這樣的精神,何愁在linux內核的學習道路上修不成大道那?

2010年3月22日更新

“問題門”第1回:我是一個初學者,兩眼一抹黑,我該如何學習內核?

fudan_abc的回答:

這個問題每個初學者都無法回避,它非常之大,完全可以做為整個“問題門”的框架而存在,其他的各種問題都不過是在這個框架上裝飾和完善。

同時這個問題並沒有一個標準的答案,只有一些學習的脈絡可以遵循,祝早日“入門”。

第一步:先會使用它。連Linux是什麽、基本操作都不會就去研究內核,純屬扯淡,“門”都沒有。

第二步:看懂內核源碼需要一些操作系統、C語言等的基礎。

第三步:找本合適的內核參考書,讓它幫助你對內核有個整體的理解和認識,

第四步:要能夠動手配置編譯內核,還要基本看得懂內核中的Kconfig和Makefile文件。

最後,記住:“學習內核,就是學習內核的源代碼,任何內核有關的書籍都是基於內核,而又不高於內核的。內核源碼本身就是最好的參考資料,其他任何經典或非經典的書最多只是起到個輔助作用,不能也不應該取代內核代碼在我們學習過程中的主導地位。”

因此你要做得是選擇內核的一個部分或子系統,以韓峰同誌對待日記的態度,嚴謹而細致得理解每一段代碼的實現,多問多想多記。切勿抱著走馬觀花,得過且過的態度。

“問題門”第2回:學習內核需要什麽基礎知識?

albcamus的回答:

(1)需要掌握操作系統理論的最初級的知識。

不需要通讀並理解《操作系統概念》《現代操作系統》等巨著,但總要知道分時(time-shared)和實時(real-time)的區別是什麽,進程是個什麽東西,CPU和系統總線、內存的關系(很粗略即可),等等。

(2)熟練使用C語言。

不需要已經很精通C語言,只要能熟練編寫C程序,能看懂鏈表、散列表等數據結構的C實現,用過gcc編譯器,就可以了。當然,如果已經精通C語言顯然是大占便宜的。

(3)了解CPU的相關知識,

Linux內核學習經驗

1. 內核學習的心理誤區

心理上的問題主要有兩個,一個是盲目,就是在能夠熟練使用Linux之前,對Linux為何物還說不出個道道來,就迫不及待的盲目的去研究內核的源代碼。重述Linus的那句話:要先會使用它。

第二個就是恐懼。人類進化這麽多年,面對復雜的物體和事情還是總會有天生的懼怕感,體現在內核學習上面就是:那麽龐大復雜的內核代碼,讓人面對起來該情何以堪啊!

有了這種恐懼無力感存在,心理上就會去排斥面對接觸內核源碼,寧願去抱著情景分析,搜集各種各樣五花八門的內核書籍放在那裏屯著,看了又忘,忘了又看,也不大情願去認真細致得瀏覽源碼。
——詳見修煉之道精華篇(9)內核學習的心理問題

2. 學習內核就是學習內核的源代碼

學習內核,就是學習內核的源代碼,任何內核有關的書籍都是基於內核,而又不高於內核的。內核源碼本身就是最好的參考資料,其他任何經典或非經典的書最多只是起到個輔助作用,不能也不應該取代內核代碼在我們學習過程中的主導地位。

3. 要抱著嚴謹細致的態度分析內核源碼

既然要學習內核源碼,就要經常對內核代碼進行分析,而內核代碼千千萬,還前仆後繼的不斷往裏加,這就讓大部分人都有種霧裏看花花不見的無助感。不過不要怕,孔老夫子早就留給我們了應對之策:敏於事而慎於言,就有道而正焉,可謂好學也已。這就是說,做事要踏實才是好學生好同誌,要遵循嚴謹的態度,去理解每一段代碼的實現,多問多想多記。如果抱著走馬觀花,得過且過的態度,結果極有可能就是一邊看一邊丟,沒有多大的收獲。

只要你使用這樣的態度開始分析內核,那麽無論你選擇內核的哪個部分作為切入點,比如USB,比如進程管理,在花費相對不算很多的時間之後,你就會發現你對內核的理解會上升到另外一個高度,一個抱著情景分析,抱著0.1內核完全註釋,抱著各種各樣的內核書籍翻來覆去的看很多遍又忘很多遍都無法達到的高度。
——詳見修煉之道精華篇(6) 與精華篇(7) 分析內核源碼如何入手?

4. 通過Kconfig與Makefile定位目標代碼

毫不誇張地說,Kconfig和Makefile是我們瀏覽內核代碼時最為依仗的兩個文件。基本上,Linux內核中每一個目錄下邊都會有一個Kconfig文件和一個Makefile文件。 對於一個希望能夠在Linux內核的汪洋代碼裏看到一絲曙光的人來說,將它們放在怎麽重要的地位都不過分。

Kconfig和Makefile就是Linux Kernel迷宮裏的地圖。地圖引導我們去認識一個城市,而Kconfig和Makefile則可以讓我們了解一個Kernel目錄下面的結構。我們每次瀏覽kernel尋找屬於自己的那一段代碼時,都應該首先看看目錄下的這兩個文件。就像利用地圖尋找目的地一樣,我們需要利用Kconfig和Makefile來尋找所要研究的目標代碼。
——詳見修煉之道精華篇(5)Kernel地圖:Kconfig與Makefile

Linux內核“問題門” - 學習問題、經驗集錦