1. 程式人生 > >Linux內核(9) - 精華版 之 方法論

Linux內核(9) - 精華版 之 方法論

http 完成 城市 post 重要 關心 基本 href 朋友

到目前為之,博客上分享的精華篇都可以歸為方法論的範疇,在很多時候,都是方法論要比細節緊要得多。而這些精華篇又可細分為三個專題:Linux大史記;內核學習的方法論;驅動開發的方法論。

Linux大史記

除去那些精彩的“門”,我們生活中乏味的事情太多了,所以不希望再去按慣例花個一二頁的篇幅乏味的寫個“Linux簡介”,就將幾天中出去溜彎的時間貢獻了出來,逐年逐月的搜集整理了一些Linux成長過程中所發生的重要的事情,抑或一些非常有趣兒的事情。

開始時本以為這是一件很輕易的事,起碼應該比統計公布房價上漲多少的事情輕易的多,利用google,完成這麽一件事情又有何難?但是意外的是,貌似很難找到類似的歸納整理,或許能夠看到某個時間段內的所謂的top10之類的字眼,但裏面的羅列似乎大都滿足不了有趣兒的要求。所以裏面有些月份是個空白,不管如何,大家可以了解了解,看看是否有很多自己不知道的有趣聞軼事?

緬懷已逝的十八年(1991~1998)

緬懷已逝的十八年(1999~2002)

緬懷已逝的十八年(2003~2006)

緬懷已逝的十八年(2007~2009)

內核學習的方法論

透過現象看本質,獸獸門無非就是一些人體藝術展示。同樣往本質裏看過去,學習內核,就是學習內核的源代碼,任何內核有關的書籍都是基於內核,而又不高於內核的。

所以這個專題的前三個精華篇就是專註於介紹如何入手分析內核源代碼的,這裏前無來者的突出強調了“Kernel地圖”的概念,雖然Goggle帶著Goggle地圖遠去了,可Kernel地圖仍然在繼續。

Kernel地圖:Kconfig與Makefile

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

我們去香港,通過海關的時候,總會有免費的地圖和各種指南拿,有了它們在手裏我們才不至於無頭蒼蠅般迷惘的行走在陌生的街道上。即使在內地出去旅遊的時候一般來說也總是會首先找份地圖,當然了,這時就是要去買了,拿是拿不到的,不同的地方有不同的特色, 只不過有的特色是服務,有的特色是索取。

Kconfig和Makefile就是Linux Kernel迷宮裏的地圖。地圖引導我們去認識一個城市,而Kconfig和Makefile則可以讓我們了解一個Kernel目錄下面的結構。我們每次瀏覽kernel尋找屬於自己的那一段代碼時,都應該首先看看目錄下的這兩個文件。

分析內核源碼如何入手?(上)

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

分析內核源碼如何入手?(下)

下面的分析,米盧教練說了,內容不重要,重要的是態度。就像韓局長對待日記的態度那樣,嚴謹而細致。

只要你使用這樣的態度開始分析內核,那麽無論你選擇內核的哪個部分作為切入點,比如USB,比如進程管理,在花費相對不算很多的時間之後,你就會發現你對內核的理解會上升到另外一個高度,一個抱著情景分析,抱著0.1內核完全註釋,抱著各種各樣的內核書籍翻來覆去的看很多遍又忘很多遍都無法達到的高度。請相信我!

讓我們在Linux社區裏發出號召:學習內核源碼,從學習韓局長開始!

對於學習來說,無論是在學校的課堂學習,還是這裏說的內核學習,效果好或者壞,最主要取決於兩個方面——方法論和心理。註意,我無視了智商的差異,這玩意兒玄之又玄,岔開了說,屬於迷信的範疇。

因此繼介紹分析內核源碼方法的三個精華篇之後,又針對內核學習過程中最為常見的兩個心理誤區做了闡述。

內核學習的心理問題

而心理上的問題主要有兩個,一個是盲目,就是在能夠熟練適用Linux之前,對Linux為何物還說不出個道道來,就迫不及待的盲目的去研究內核的源代碼。這一部分人會覺得既然是學習內核,那麽耗費時間在熟悉Linux的基本操作上純粹是浪費寶貴的時間和感情。不過這樣雖然很有韓峰同誌的熱情和幹勁兒,但明顯走入了一種心理誤區。重述Linus的那句話:要先會使用它。

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

即使有好的方法和堅強的心理,我們在內核學習過程中仍需要利用很多好的資源。其實,韓峰同誌已經在日記裏告訴了我們資源的重要性,因此我們在學習韓峰同誌嚴謹細致的態度同時,還要領悟他對資源的靈活運用。只有在以內核源碼為中心,堅持各種學習資源的長期建設不動搖,才能達到韓局長那樣的高度,俯視Linux內核世界裏的人生百態。

內核學習的相關資源

待到山花爛漫時,還是那些經典在微笑。

驅動開發的方法論

因為至少在國內大部分內核相關的開發都是驅動的開發,所以在內核學習的方法論之後,專門用一個專題,從模塊機制、設備模型、驅動三件寶三個層次介紹了驅動開發的方法論。

模塊機制與“Hello World!”

有一種感動,叫淚流滿面,有一種機制,叫模塊機制。顯然,這種模塊機制給那些Linux的發燒友們帶來了方便,因為模塊機制意味著人們可以把龐大的Linux內核劃分為許許多多個小的模塊。對於編寫設備驅動程序的開發者來說,從此以後他們可以編寫設備驅動程序卻不需要把她編譯進內核,不用reboot機器,她只是一個模塊,當你需要她的時候,你可以把她抱入懷中(insmod),當你不再需要她的時候,你可以把她一腳踢開(rmmod)。

設備模型(上)

設備模型(下)

對於驅動開發來說,設備模型的理解是根本,毫不誇張得說,理解了設備模型,再去看那些五花八門的驅動程序,你會發現自己站在了另一個高度,從而有了一種俯視的感覺,就像鳳姐俯視知音和故事會,韓峰同誌俯視女下屬。

顧名而思義就知道設備模型是關於設備的模型,既不是任小強們的房模,也不是張導的炮模。對咱們寫驅動的和不寫驅動的人來說,設備的概念就是總線和與其相連的各種設備了。電腦城的IT工作者都會知道設備是通過總線連到計算機上的,而且還需要對應的驅動才能用,可是總線是如何發現設備的,設備又是如何和驅動對應起來的,它們經過怎樣的艱辛才找到命裏註定的那個他,它們的關系如何,白頭偕老型的還是朝三暮四型的,這些問題就不是他們關心的了,而是咱們需要關心的。在房市股市千錘百煉的咱們還能夠驚喜的發現,這些疑問的中心思想中心詞匯就是總線、設備和驅動,沒錯,它們就是咱們這裏要聊的Linux設備模型的名角。

驅動開發三件寶:spec、datasheet與內核源碼

設備模型之外,對於驅動程序的開發者來說,有三樣東西是不可缺少的:第一是協議或標準的spec,也就是規範,比如usb協議規範;第二是硬件的datasheet,即你的驅動要支持的硬件的手冊;第三就是內核裏類似驅動的源代碼,比如你要寫觸摸屏驅動的話,就可以參考內核裏已經有的一些觸摸屏驅動。

Linux內核問題門

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

Linux內核問題門——學習問題、經驗集錦(持續更新中……)

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

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

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

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

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

Linux內核(9) - 精華版 之 方法論