{eval=Array;=+count(Array);}
linux 0.11的內核源碼,結合下面這本書,我花了大概一個寒假(1個半月),看了一遍。
然而,現在的內核已經膨脹的不成樣子了,以還不算最新的linux-4.9.229為例:
整個內核源碼一共約 801M:
驅動代碼占了大概一半,大約407M:
體系相關的代碼大約164M:
網路子系統相關的代碼29M:
文件系統相關的代碼38M:
linux內核核心代碼大約7.7M:
但是就這7.7M,其實你要完全看完看懂也不容易。linux內核代碼涉及c語言、硬件組成原理、操作系統、數據結構和算法等,這些基礎知道你都具備了嗎?如果沒有具備,即使看完linux內核源碼,你也看不懂liux內核的精髓。
linux內核源碼大而全,一個人,即使再聰明、再有精力,也不可能完全看完、看懂所有的linux內核源碼。你得選擇一個主線進行深入研究,這些主線可以是:
沿著某一個主線,深入進去,在研究清楚這個主線的同時,向其他的主線擴展、滲透和學習。由點到線、由線到面、由面到體,層層深入、不斷精進,是學習linux內核源碼的一個有效的方法。
關注”技術簡說“,帶你由淺入深學習linux內核源碼。linux內核開發100講免費教程,每周二、周四晚上9點更新視頻,每周一、周三晚9點更新文章,敬請收看。進我主頁點”視頻“欄目即可觀看。
linux內核不需要看完,分分類,選幾個必須看的研究一下,多數不需要看。
內存管理,中斷管理,進程管理,進程調度,設備管理,inode數據結構等是必修的,設備驅動看倆代表性的,串口的,鍵盤的, 磁盤的。文件系統看一個意思一下,文件系統很多,代碼太多一輩子都看不完。中斷管理要多看看,涉及到很多定時,包括進程調度。
當年我花一學期陸陸續續看完所以unix內核代碼,但那時的代碼少,就2,3萬行,現在linux全部內核一輩子也看不完。
老鐵,我也在學習linux內核,我說一下我的想法吧。
我曾經很早的時候就想學習linux內核了,當時準備啃書,并對著代碼看,熱情了一陣子,可由于太深奧就不了了之了。
最近工作原因,涉及到內核文件系統的研究,重新學習內核,感覺比較容易弄懂了。為了避免走彎路,我建議:
1. 不要一來就對著內核源碼啃。內核源碼壓縮后現在都一百多M了,有生之年你也別想全看完弄懂,各種算法,詭異的寫法會弄暈你。
2. 先找一些內核實現原理的書來大致看一遍,這個時候不必深究細節,不懂的就做一些問題清單記起來。
3. 內核由幾大模塊構成,你要大概了解它們的相互關系。例如進程中就記錄了打開的文件信息,進程的地址空間主要內存管理模塊來分配和管理內存。
4. 選擇一個模塊作為切入點,通過實驗對內核下手!我是從文件系統這塊開始的,比較簡單這次沒有搞暈我了。
5. 必須動手實驗,光看書是沒用的!?。∧阌H自通過加打印,或斷點調試跟蹤代碼調用路徑,通過自己寫代碼實現一些功能后,你自己會豁然開朗,信心大增了!
希望我的回答對你有用!
linux內核代碼算是開源社區里面一盞明燈般的存在,雖然代碼是開源但是核心領域能夠看懂并且能夠真正修改的數量極其的稀少了,大部分代碼的更新更多是外圍設備功能的增添,這種修改距離內核級別的改動還是存在本質的差異,而且很多中國的程序員已經參與到很多模塊代碼的提交了,證明了中國軟件行業也在快速發展壯大過程中,證明了很多國內程序員已經度過了最原始的積累過程。
從一個程序員對于編程系統掌握的層次來講,首先是基礎編程語言的語言學習過程,然后是能夠看懂代碼,最后是代碼的項目實戰過程中,其實看代碼和寫代碼的過程兩者屬于相輔相成的過程,不斷的研究代碼機構從中汲取精華然后應用到實際環境中,在實際項目中找到具體的場景把自己掌握的一些理論模型在實戰中發揮出來,這種屬于學以致用的典型,所以一個成熟的程序員需要不斷的研究新的代碼機構,然后想辦法在實踐中展示自己的能力,形成良性的循環在現實中很多程序員在初級入門階段還是積極的學習優秀的代碼,在掌握了一定層次的編程能力之后就放慢了學習的腳步,這種模式下非常容易慢慢落伍。
如果從一個普通C++程序員的角度慢慢學習linux內核,需要具備以下幾種基礎首先由一個認知linux內核的代碼是C語言和匯編完成,單純的C++未必能夠滿足其基本的研究需要,所以先要把C語言的基礎語法以及內部關鍵的語法掌握清楚,同時掌握一定的匯編知識,在linux內核的影響效率的地方會使用匯編,所以掌握了匯編和C語言基礎的語法之后再去嘗試研究linux內核源碼,如果不準備好基礎編程語法,去研究linux內核將是一種災難般的存在;對linux內核的api接口有一定的了解,了解外圍的調用接口才能有助于了解內部是如何實現的,對于linux內核的驅動常規知識也需要有一定程度的掌握。
至于需要多長的時間能夠看完linux內核知識,這種時間是無法確定有些人linux內核已經研究十幾年了還是覺的里面有很多不了解的地方,可以嘗試先從基礎的模塊開始熟悉從宏觀上了解其工作原理,然后根據自己的興趣愛好找到感興趣的模塊進行研究學習,不要指望多長時間能夠掌握透徹,能夠當成一輩子研究的事業去做,不要嘗試給自己設定時間去完成學習linux內核這種巨大的工程,可以設定時間掌握宏觀的框架,但更合適的做法是當成一種興趣愛好長期去做,希望能幫到你。
Linux內核分為CPU調度、內存管理、網絡和存儲四大子系統,針對硬件的驅動成百上千。代碼的數量更是大的驚人。看看最新的關于內核代碼量的統計。
從圖中可以看出,2020年1月份,內核的代碼量大約是2千6百萬行?;貞浤阋幌履阋惶炷芸炊嗌俅a?反正我自己覺得自己一輩子都看不完Linux內核的代碼。
其實閱讀代碼無非是為了學習代碼中有用的內容,所以,我們沒有必要閱讀所有的代碼,只需要閱讀關鍵的代碼,或者說對自己有用的代碼。
由于內核分為四大子系統,因此我們可以選擇自己相關的子系統來閱讀。比如你是做存儲相關的,可以閱讀存儲棧相關的代碼,如果你是做網絡的,你可以做網絡相關的代碼。
對于代碼閱讀方法從兩個角度來介紹,一個方面是需要選擇一個比較有效閱讀代碼的工具,這樣能輔助我們來理解代碼;另外一個方面是先閱讀基礎代碼,比如鏈表,自旋鎖等等。
當然,Linux內核確實博大精深,想要一下子搞明白是不可能的。
有些人推薦先閱讀一些低版本的內核,比如0.01版的,總代碼量才1萬行左右。閱讀這個代碼大概一個月應該能比較清晰了。但是,改代碼與現在的代碼差異巨大,閱讀后可以理解基本思想,但對理解現有代碼的幫助不是特別明顯。所以,還是要根據自己的需求來選擇性的閱讀比較好。
以上個人觀點,僅供參考。
代碼并不是寫給人看的,而是交給機器運行的。
所以我們去理解別人的代碼時,并不能像看小說一樣去通篇的閱讀代碼,而應該是像研究化石一樣去調查它,解密它。有時我們往往也需要把對方的一段代碼親手的實現一遍,然后自己舉一反三看自己會怎么去實現它,才能真正的理解。
舉個例子:
不管是建一棟樓還是建一棟木屋,大致流程是這樣的:畫圖紙→打地基→整平地面→建框架→砌墻→裝修。
雖然大致流程是一樣的,但顯然建一棟樓所需要實現的細節遠遠大于建一棟木屋。
如果我們要學習如何去建造一棟樓,我們可以先學會如何建一棟“木屋”,然后再深入的學習建造一棟“樓”的某個模塊,再轉向其他模塊的學習。只有通過不斷的實踐,才有可能建成一棟布局合理、堅固耐用的樓,而不是空想。如果只知道生搬硬套別人的理論知識而不懂得根據實際情況作出改變,就像搭積木一樣,建成的樓最終還是會東倒西歪而倒塌。
在戰場上可以沒有某個士兵,但不能沒有擁有全局觀念的指揮官,指揮官即使不親自上戰場也能左右整個戰爭的結果。指揮官也是從士兵做起的,但不是每個士兵都能變成指揮官。
Linux內核最初是由李納斯?托瓦茲在赫爾辛基大學讀書時出于個人愛好而編寫的。第1版本于1991年9月發布,當時僅有10000行代碼。如今的Linux內核Git源碼樹中的代碼達到了2780萬行,核心代碼只有2%是由李納斯?托瓦茲自己編寫的,其他均是其他個人和組織貢獻的,李納斯?托瓦茲公開了Linux但保留了選擇新代碼和需要合并的新方法的最終裁定權。
這么多的代碼一個人可能窮盡一輩子都很難吃透,如果有人能夠完全吃透,世界上除了Windows、MacOS、Linux,早就誕生了其他的很流行的系統了?!澳妥〖拍?,閱讀代碼”并不是一個可行的辦法。在大多數情況下會半途而廢,一個月之后,可能全部都忘記了。
假如我們向某個人很有能力的人學習,并不是跟在他的屁股后面,他做什么你就做什么,那你的這個學習的過程只可能形似,而不是神似。當你多帶帶處理某件事時,還是會手忙腳亂、處理的很不好。學習這個人的過程應該是看他處理某件事分開了哪個步驟,每個步驟又是如何處理和銜接的,自己有沒有更好的方法實現。
學習Linux也是一樣的,你需要知道Linux內核是由那些模塊組成的,這些模塊實現的是什么樣的功能,這些功能實現的原理是什么,模塊與模塊之間又是如何銜接才構成了一個完整的系統。通俗一些講就是要有將軍的架構意識和合理調控意識,而不是士兵的沖鋒陷陣和奮勇殺敵的意志。因為Linux是一個龐大的系統,而不是時間線上的某一件事情。
沒有當過士兵的將軍能不能算是好士兵?不能,充其量只能算是“紙上談兵”,將軍只有清楚地了解士兵是如何沖鋒陷陣和奮勇殺敵才知道如何去擺兵布陣。所以學習Linux不光光是要有閱讀代碼的能力,還需要有能熟練寫出優秀代碼的能力。
比如:
所以我們對Linux內核的框架結構有了全面的了解之后,可以通過深入的學習某個模塊來培養我們寫代碼的能力。當寫代碼的能力不斷的提升就會對Linux內核有一個比較透徹的理解,這時就已經完全學會了Linux內核。
有人說窮盡一個人的一生都很難寫出媲美Windows、MacOS、Linux那樣的系統,但如果你對操作系統有架構層面的全面認識的時候,就不會這么說了。
Windows、MacOS、Linux并不是一個人獨立完成的,他們是許許多多的人團隊協作的結果。假如一個人獨立完成一個操作系統需要100年,通過劃分模塊,將每個模塊分給不同的團隊來做,最終每個模塊測試完后,整合成一個完整的系統,可能只需要幾年。Linux內核從最初的10000行代碼到現在的2780萬行代碼就是全球精英共同貢獻的結果。
以上個人淺見,歡迎批評指正。
認同我的看法,請點個贊再走,感謝!
喜歡我的,請關注我,再次感謝!
究竟要多久才能看完Linux內核源碼,這取決于你是否是計算機大類專業的畢業生(或者說你學過操作系統原理、計算機網絡、計算機組成原理、匯編語言程序設計、數據結構等基礎課程),也需要根據你學習的目的來確定:
第一、如果你只是希望大致了解一下Linux操作系統的設計原理等基礎知識,那么對照Linux 2.4的內核源碼,結合操作系統原理(普通教科書,比如湯子瀛編著的)、LINUX操作系統原理與應用(陳莉君編著)等書籍,大約半年就能夠有個大概了解。
第二、如果你希望將來做Linux系統上面的應用開發,那么對照Linux 較新的內核源碼,結合LINUX操作系統原理與應用(陳莉君編著)、Linux程序設計(第4版)、Unix環境高級編程等書籍,大約一年左右就能夠上手。
第三、如果你希望將來做Linux系統的內核開發,那么對照Linux 較新的內核源碼,結合Linux內核設計與實現、Linux Device Drivers等書籍,大約一年以上就能夠上手。
可能需要三五年吧!現在的內核代碼越來越大,如果你只是想學習核心的知識,可以看看以前的內核代碼,比如 Linux2.4代碼情景分析,估計幾個月就可以看完。
我覺得一個人窮其一生也看不完整個內核的源碼,Linux內核全世界的程序員在維護,現在已經變得無比龐大,連Linus本人也未必能讀完。現實一點,找幾個自己感興趣的框架閱讀一下就可以了,比如網絡框架、多媒體框架等等。更深入一點閱讀內存管理文件管理也是可以的,但意義不大,除非自己想搞一套操作系統,并且要有一定的硬件基礎。
學習任何東西,都要明白目的是什么。像Linux內核源碼是一個龐大系統工程,需要大量精力和時間投入才能理解里面邏輯結構和算法體系。我想你肯定已經是工作了,內核源碼這種東西可能需要消耗掉你平時休閑大量時間,而且投入時間長,回報周期長,這種投資回報明顯是不合適,除非你的工作是有關linux的內核源碼或者你本身就是linux內核源碼開發者。我個人建議是,可以結合自己本身工作的知識點,抓住與工作相關內核源碼知識研究。
0
回答0
回答0
回答0
回答0
回答0
回答0
回答10
回答0
回答0
回答