需要多久才能看完linux內核源碼?作為一名普通的c++程序員,目前想要學習linux內核源碼,想逐步閱讀,需要多久才能看完linux內核源碼呢?:linux 0.11的內核源碼
linux 0.11的內核源碼,結合下面這本書,我花了大概一個寒假(1個半月),看了一遍。
然而,現(xiàn)在的內核已經(jīng)膨脹的不成樣子了,以還不算最新的linux-4.9.229為例:
整個內核源碼一共約 801M:
驅動代碼占了大概一半,大約407M:
體系相關的代碼大約164M:
網(wǎng)路子系統(tǒng)相關的代碼29M:
文件系統(tǒng)相關的代碼38M:
linux內核核心代碼大約7.7M:
但是就這7.7M,其實你要完全看完看懂也不容易。linux內核代碼涉及c語言、硬件組成原理、操作系統(tǒng)、數(shù)據(jù)結構和算法等,這些基礎知道你都具備了嗎?如果沒有具備,即使看完linux內核源碼,你也看不懂liux內核的精髓。
linux內核源碼大而全,一個人,即使再聰明、再有精力,也不可能完全看完、看懂所有的linux內核源碼。你得選擇一個主線進行深入研究,這些主線可以是:
沿著某一個主線,深入進去,在研究清楚這個主線的同時,向其他的主線擴展、滲透和學習。由點到線、由線到面、由面到體,層層深入、不斷精進,是學習linux內核源碼的一個有效的方法。
關注”技術簡說“,帶你由淺入深學習linux內核源碼。linux內核開發(fā)100講免費教程,每周二、周四晚上9點更新視頻,每周一、周三晚9點更新文章,敬請收看。進我主頁點”視頻“欄目即可觀看。
老鐵,我也在學習linux內核,我說一下我的想法吧。
我曾經(jīng)很早的時候就想學習linux內核了,當時準備啃書,并對著代碼看,熱情了一陣子,可由于太深奧就不了了之了。
最近工作原因,涉及到內核文件系統(tǒng)的研究,重新學習內核,感覺比較容易弄懂了。為了避免走彎路,我建議:
1. 不要一來就對著內核源碼啃。內核源碼壓縮后現(xiàn)在都一百多M了,有生之年你也別想全看完弄懂,各種算法,詭異的寫法會弄暈你。
2. 先找一些內核實現(xiàn)原理的書來大致看一遍,這個時候不必深究細節(jié),不懂的就做一些問題清單記起來。
3. 內核由幾大模塊構成,你要大概了解它們的相互關系。例如進程中就記錄了打開的文件信息,進程的地址空間主要內存管理模塊來分配和管理內存。
4. 選擇一個模塊作為切入點,通過實驗對內核下手!我是從文件系統(tǒng)這塊開始的,比較簡單這次沒有搞暈我了。
5. 必須動手實驗,光看書是沒用的。。∧阌H自通過加打印,或斷點調試跟蹤代碼調用路徑,通過自己寫代碼實現(xiàn)一些功能后,你自己會豁然開朗,信心大增了!
希望我的回答對你有用!
linux內核代碼算是開源社區(qū)里面一盞明燈般的存在,雖然代碼是開源但是核心領域能夠看懂并且能夠真正修改的數(shù)量極其的稀少了,大部分代碼的更新更多是外圍設備功能的增添,這種修改距離內核級別的改動還是存在本質的差異,而且很多中國的程序員已經(jīng)參與到很多模塊代碼的提交了,證明了中國軟件行業(yè)也在快速發(fā)展壯大過程中,證明了很多國內程序員已經(jīng)度過了最原始的積累過程。
從一個程序員對于編程系統(tǒng)掌握的層次來講,首先是基礎編程語言的語言學習過程,然后是能夠看懂代碼,最后是代碼的項目實戰(zhàn)過程中,其實看代碼和寫代碼的過程兩者屬于相輔相成的過程,不斷的研究代碼機構從中汲取精華然后應用到實際環(huán)境中,在實際項目中找到具體的場景把自己掌握的一些理論模型在實戰(zhàn)中發(fā)揮出來,這種屬于學以致用的典型,所以一個成熟的程序員需要不斷的研究新的代碼機構,然后想辦法在實踐中展示自己的能力,形成良性的循環(huán)在現(xiàn)實中很多程序員在初級入門階段還是積極的學習優(yōu)秀的代碼,在掌握了一定層次的編程能力之后就放慢了學習的腳步,這種模式下非常容易慢慢落伍。
如果從一個普通C++程序員的角度慢慢學習linux內核,需要具備以下幾種基礎首先由一個認知linux內核的代碼是C語言和匯編完成,單純的C++未必能夠滿足其基本的研究需要,所以先要把C語言的基礎語法以及內部關鍵的語法掌握清楚,同時掌握一定的匯編知識,在linux內核的影響效率的地方會使用匯編,所以掌握了匯編和C語言基礎的語法之后再去嘗試研究linux內核源碼,如果不準備好基礎編程語法,去研究linux內核將是一種災難般的存在;對linux內核的api接口有一定的了解,了解外圍的調用接口才能有助于了解內部是如何實現(xiàn)的,對于linux內核的驅動常規(guī)知識也需要有一定程度的掌握。
至于需要多長的時間能夠看完linux內核知識,這種時間是無法確定有些人linux內核已經(jīng)研究十幾年了還是覺的里面有很多不了解的地方,可以嘗試先從基礎的模塊開始熟悉從宏觀上了解其工作原理,然后根據(jù)自己的興趣愛好找到感興趣的模塊進行研究學習,不要指望多長時間能夠掌握透徹,能夠當成一輩子研究的事業(yè)去做,不要嘗試給自己設定時間去完成學習linux內核這種巨大的工程,可以設定時間掌握宏觀的框架,但更合適的做法是當成一種興趣愛好長期去做,希望能幫到你。
linux內核不需要看完,分分類,選幾個必須看的研究一下,多數(shù)不需要看。
內存管理,中斷管理,進程管理,進程調度,設備管理,inode數(shù)據(jù)結構等是必修的,設備驅動看倆代表性的,串口的,鍵盤的, 磁盤的。文件系統(tǒng)看一個意思一下,文件系統(tǒng)很多,代碼太多一輩子都看不完。中斷管理要多看看,涉及到很多定時,包括進程調度。
當年我花一學期陸陸續(xù)續(xù)看完所以unix內核代碼,但那時的代碼少,就2,3萬行,現(xiàn)在linux全部內核一輩子也看不完。
可能需要三五年吧!現(xiàn)在的內核代碼越來越大,如果你只是想學習核心的知識,可以看看以前的內核代碼,比如 Linux2.4代碼情景分析,估計幾個月就可以看完。
代碼并不是寫給人看的,而是交給機器運行的。
所以我們去理解別人的代碼時,并不能像看小說一樣去通篇的閱讀代碼,而應該是像研究化石一樣去調查它,解密它。有時我們往往也需要把對方的一段代碼親手的實現(xiàn)一遍,然后自己舉一反三看自己會怎么去實現(xiàn)它,才能真正的理解。
舉個例子:
不管是建一棟樓還是建一棟木屋,大致流程是這樣的:畫圖紙→打地基→整平地面→建框架→砌墻→裝修。
雖然大致流程是一樣的,但顯然建一棟樓所需要實現(xiàn)的細節(jié)遠遠大于建一棟木屋。
如果我們要學習如何去建造一棟樓,我們可以先學會如何建一棟“木屋”,然后再深入的學習建造一棟“樓”的某個模塊,再轉向其他模塊的學習。只有通過不斷的實踐,才有可能建成一棟布局合理、堅固耐用的樓,而不是空想。如果只知道生搬硬套別人的理論知識而不懂得根據(jù)實際情況作出改變,就像搭積木一樣,建成的樓最終還是會東倒西歪而倒塌。
在戰(zhàn)場上可以沒有某個士兵,但不能沒有擁有全局觀念的指揮官,指揮官即使不親自上戰(zhàn)場也能左右整個戰(zhàn)爭的結果。指揮官也是從士兵做起的,但不是每個士兵都能變成指揮官。
Linux內核最初是由李納斯?托瓦茲在赫爾辛基大學讀書時出于個人愛好而編寫的。第1版本于1991年9月發(fā)布,當時僅有10000行代碼。如今的Linux內核Git源碼樹中的代碼達到了2780萬行,核心代碼只有2%是由李納斯?托瓦茲自己編寫的,其他均是其他個人和組織貢獻的,李納斯?托瓦茲公開了Linux但保留了選擇新代碼和需要合并的新方法的最終裁定權。
這么多的代碼一個人可能窮盡一輩子都很難吃透,如果有人能夠完全吃透,世界上除了Windows、MacOS、Linux,早就誕生了其他的很流行的系統(tǒng)了。“耐住寂寞,閱讀代碼”并不是一個可行的辦法。在大多數(shù)情況下會半途而廢,一個月之后,可能全部都忘記了。
假如我們向某個人很有能力的人學習,并不是跟在他的屁股后面,他做什么你就做什么,那你的這個學習的過程只可能形似,而不是神似。當你單獨處理某件事時,還是會手忙腳亂、處理的很不好。學習這個人的過程應該是看他處理某件事分開了哪個步驟,每個步驟又是如何處理和銜接的,自己有沒有更好的方法實現(xiàn)。
學習Linux也是一樣的,你需要知道Linux內核是由那些模塊組成的,這些模塊實現(xiàn)的是什么樣的功能,這些功能實現(xiàn)的原理是什么,模塊與模塊之間又是如何銜接才構成了一個完整的系統(tǒng)。通俗一些講就是要有將軍的架構意識和合理調控意識,而不是士兵的沖鋒陷陣和奮勇殺敵的意志。因為Linux是一個龐大的系統(tǒng),而不是時間線上的某一件事情。
沒有當過士兵的將軍能不能算是好士兵?不能,充其量只能算是“紙上談兵”,將軍只有清楚地了解士兵是如何沖鋒陷陣和奮勇殺敵才知道如何去擺兵布陣。所以學習Linux不光光是要有閱讀代碼的能力,還需要有能熟練寫出優(yōu)秀代碼的能力。
比如:
所以我們對Linux內核的框架結構有了全面的了解之后,可以通過深入的學習某個模塊來培養(yǎng)我們寫代碼的能力。當寫代碼的能力不斷的提升就會對Linux內核有一個比較透徹的理解,這時就已經(jīng)完全學會了Linux內核。
有人說窮盡一個人的一生都很難寫出媲美Windows、MacOS、Linux那樣的系統(tǒng),但如果你對操作系統(tǒng)有架構層面的全面認識的時候,就不會這么說了。
Windows、MacOS、Linux并不是一個人獨立完成的,他們是許許多多的人團隊協(xié)作的結果。假如一個人獨立完成一個操作系統(tǒng)需要100年,通過劃分模塊,將每個模塊分給不同的團隊來做,最終每個模塊測試完后,整合成一個完整的系統(tǒng),可能只需要幾年。Linux內核從最初的10000行代碼到現(xiàn)在的2780萬行代碼就是全球精英共同貢獻的結果。
以上個人淺見,歡迎批評指正。
認同我的看法,請點個贊再走,感謝!
喜歡我的,請關注我,再次感謝!
究竟要多久才能看完Linux內核源碼,這取決于你是否是計算機大類專業(yè)的畢業(yè)生(或者說你學過操作系統(tǒng)原理、計算機網(wǎng)絡、計算機組成原理、匯編語言程序設計、數(shù)據(jù)結構等基礎課程),也需要根據(jù)你學習的目的來確定:
第一、如果你只是希望大致了解一下Linux操作系統(tǒng)的設計原理等基礎知識,那么對照Linux 2.4的內核源碼,結合操作系統(tǒng)原理(普通教科書,比如湯子瀛編著的)、LINUX操作系統(tǒng)原理與應用(陳莉君編著)等書籍,大約半年就能夠有個大概了解。
第二、如果你希望將來做Linux系統(tǒng)上面的應用開發(fā),那么對照Linux 較新的內核源碼,結合LINUX操作系統(tǒng)原理與應用(陳莉君編著)、Linux程序設計(第4版)、Unix環(huán)境高級編程等書籍,大約一年左右就能夠上手。
第三、如果你希望將來做Linux系統(tǒng)的內核開發(fā),那么對照Linux 較新的內核源碼,結合Linux內核設計與實現(xiàn)、Linux Device Drivers等書籍,大約一年以上就能夠上手。
先拋結論,Linux內核源碼屬于那種有生之年都不能看完的類型,但是并不妨礙我們通過努力成為某個領域的系統(tǒng)專家。
Linux內核代碼行數(shù)有多少?
最近Phoronix發(fā)布了對Linux內核倉庫的統(tǒng)計信息。統(tǒng)計信息顯示Linux內核代碼庫雖然過去一年linux內核大肆精簡了大約100萬的代碼,仍然有2780萬行代碼,其中核心代碼占5%,網(wǎng)絡相關的代碼占35%,驅動超過40%。
看重點,總代碼行數(shù)超過2700萬行,而且這個總量還在因為新的硬件驅動代碼加入而持續(xù)增加中。
代碼這么多? 學習內核該如何入手?
從上面數(shù)據(jù)看,如果純粹看代碼,估計有生之年都沒辦法閱讀完。那么Linux內核真的沒有辦法學習了嗎? 答案是否定的, 既然操作系統(tǒng)是人創(chuàng)造出來的,那么就一定是人能夠掌握和維護的。單純從數(shù)據(jù)上看,內核中有75%的代碼都是和網(wǎng)絡與驅動相關的。網(wǎng)絡部分實現(xiàn)了各種網(wǎng)絡協(xié)議棧,驅動部分適配的各種各樣的硬件,核心代碼大概只有5%,涉及調度,內存管理,虛擬文件系統(tǒng)等。
也就是說除了這兩個部分,核心代碼數(shù)量也沒有那么夸張。
內核包含很多子模塊,包括調度,內存管理,文件系統(tǒng),網(wǎng)絡,系統(tǒng)接口,驅動等等,每一個子模塊都代表一個大的領域,都是大有可為的,但是每個人不可能有那么多精力去全部精通,因此只能選擇一個自己感興趣的方向去深入,而其它的模塊只需要大概了解原理即可。
作為Linux創(chuàng)始人Linus Torvalds ,他貢獻的代碼現(xiàn)在在內核里面也僅僅占到百分之3點幾,Torvalds精力也是有限的,他負責審核的代碼倉庫也就那么幾個,而其它的大多都交給開源社區(qū)維護管理去了。
要成為大神一定要讀一讀Linux源碼嗎?
很多人都抱著朝圣的心理,想去拜讀一下Linux內核源碼,好像沒有看過源碼就不夠格成為大神,真的是這樣嗎? 作為一個多年的內核開發(fā)者,真的不建議新手就去直接學習內核源碼。
且拋開操作系統(tǒng)的復雜性不談,光是內核里面的各種宏技巧,各種炫技的寫法,就足夠新手迷惑好半天。事實上,內核代碼并不是一個很好的入門讀物,你得有一定的開發(fā)基礎,并且在真正需要的情況下,才會試圖去了解它的原理。而且絕大部分情況下,你都用不著修改它,畢竟能發(fā)現(xiàn)了一個內核bug,都算是很牛的事情了。
要成為大神,其實有很多很多的努力方向,不一定非看懂操作系統(tǒng)不可,操作系統(tǒng)方向是成為大神的一條路,但不是唯一的路。等你在工作中,真正到了需要修改優(yōu)化系統(tǒng)的時候,再去深入了解也不遲。
我是科技領域博主@經(jīng)緯科技談,我的回答希望對你能有所幫助,喜歡我的文章朋友歡迎點贊和關注。
是否先去學習如何基于Linux寫系統(tǒng)軟件,然后有了完整的Linux系統(tǒng)軟件工作經(jīng)驗,再去深入學習Linux代碼,會不會更好?
請有基于Linux系統(tǒng)軟件的大神指點。中國基于Linux寫系統(tǒng)軟件的公司應該不多吧?華為鴻蒙、阿里云,深度、紅旗麒麟、紅旗xx。
Linux內核兼容的驅動太少,現(xiàn)在老的新的海量的芯片核顯和獨立顯卡等硬件研發(fā)生產(chǎn)時,各廠家都是圍繞Windows進行驅動程序調試適配生產(chǎn)的,硬件一出廠就和Windows定下了青梅竹馬的“娃娃親”,燒成灰都相互認識,裝機順利沒有Linux裝機磕磕碰碰鼻青臉腫也進不去。跟Linux完全就是“陌生人”,又看不上Linux窮小子,兼容不兼容無所謂,不是這些硬件廠家考慮的事,各大硬件官網(wǎng)只有Windows7、Windows10主流系統(tǒng)的驅動提供下載。
有些小白說,驅動不是問題,光要國產(chǎn)軟件應用豐富就行,說得倒很輕飄簡單。他們不知道生態(tài)分兩部分:①硬件及驅動 ②應用軟件。沒有主要核心零部件驅動,連裝系統(tǒng)和體驗系統(tǒng)的門都進不去。電腦的機理跟我們人體系統(tǒng)機理差不多,手腳、眼睛、耳鼻等一系列的器官只不過是人體系統(tǒng)的硬件,神經(jīng)系統(tǒng)才是器官連接大腦CPU的驅動程序,讓人能夠活動自如,沒有神經(jīng)驅動我們人就變成聾子、睜眼瞎、癱子、瘸子類型的殘疾人。大家平時主要直接跟各種行業(yè)應用和系統(tǒng)設置面對面的打交道,系統(tǒng)運行穩(wěn)定時跟驅動接觸少,只有裝系統(tǒng)和出故障時才接觸到驅動程序,驅動程序是系統(tǒng)中協(xié)調系統(tǒng)各層面的默默無聞的幕后英雄。
同時驅動程序也是闖禍者,成熟系統(tǒng)只占故障率的10%左右,系統(tǒng)80~90%的故障都是來源于驅動系統(tǒng)的缺失和不兼容,驅動出錯,系統(tǒng)背鍋。驅動缺失,系統(tǒng)挨罵!
驅動兼容缺失會導致很大一部分機器U盤引導裝深度Deepin64位和優(yōu)麒麟系統(tǒng)時就卡死到藍屏狀態(tài),裝Deepin32位正常,裝Windows64位也正常,說明Linux內核和硬件廠商沒有相互協(xié)作把Linux驅動維護升級,半途荒廢到那兒了。所以Linux和這些芯片顯卡硬件相遇時會出現(xiàn)“你不認識我,我不認識你”的卡死狀態(tài),能裝上deepin都是碰上了運氣!像中彩票一樣。
實在要硬盤真實安裝,制作U盤啟動盤安裝碰碰運氣吧,如果裝不上,就不要勉強,不管你用什么U盤燒錄工具都沒用,白費勁。即使通過什么調試勉強安裝上,接下來會有各種各樣的其他類型驅動引起的問題讓你寸步難行,掛了都是家常便飯。
要想看看Deepin是個啥樣子,裝個虛擬機,虛擬機就像是“孫”,會七十二般變化,它能虛擬變化成出各種各樣的兼容Linux的驅動,虛擬機運行deepin非常穩(wěn)定流暢,沒有各種驅動困擾。作為體驗過各大Linux的過來人說句實話,不管是deepin還是優(yōu)麒麟、新支點、Ubuntu等五花八門的Linux發(fā)行版都是非常低級的,都屬于狗肉上不了席的程序員使用的小眾系統(tǒng),成不了大眾系統(tǒng),尤其是AI智能的未來,像原始DOS的命令行方式的系統(tǒng)只能當個玩具玩玩而已,不能當作生產(chǎn)力,跟不上時代發(fā)展的要求。
國內一些的Linux技術人員和團隊仍然固步自封,自我陶醉在Linux所謂的代碼效率高的小圈子里,成了“井底蛙”,就不想跳出井口看看外面的世界,哪怕看一眼Android這個成功的范例,它可是Linux的親兒子,問Android中有一條或者是有半條命令行了嗎?想起了一位主持人說的話:就算低頭拉車,也要抬頭看一看天。
目前的Deepin被一批膚淺者帶偏了,正事不足討論什么圓角直角的美與丑、額頭的大與小、老桌面與新桌面的比較投票,走偶像派。無可厚非,走偶像是收獲了一點粉絲,“新鮮勁”是有期限的,還得靠系統(tǒng)的可靠和能力維持人機的長期協(xié)作伙伴關系。就目前深度不可能維持魚和熊掌二者兼得的局面,把有限的精力投入到關鍵的地方。
關于Linux內核,它是屬于全世界的,不專屬于哪個國家地區(qū)和組織。中國還沒有哪一家公司有強大的人力、物力、影響力、科技實力對Linux內核進行改進和提升,貢獻中國智慧,中國力量,中國解決方案,改善內核兼容海量的驅動,都想投機取巧,喜好形式主義的表面文章,爭先恐后干換皮的裝修公司一大堆,包括華為、小米這樣典型的公司都拿現(xiàn)成的安卓換皮裝修。鴻蒙系統(tǒng),自己和媒體一波一波吹牛聲波傳遍了全世界,只有敏銳者看清的是只剩名字起得好!連哄帶蒙,至今連個影子都沒有。
國內Deepin和優(yōu)麒麟將要面對生態(tài)鏈中遇到第一道難以逾越的驅動鴻溝。一大部分機器安裝失敗其實是Linux內核天生的營養(yǎng)不良的缺陷導致。
一天中什么時候運動減肥效果好抓 小孩能不能練啞鈴多大的孩子適合 小孩嘴唇起皮怎么辦怎樣才能預防 孩子的羅圈腿是怎么形成的三大因 孩子早戀怎么辦如何有效疏導孩子 醫(yī)生婆婆稱自己專業(yè)孩子的事必須 兒子成人禮送什么禮物好呢給你孩 有孩子的夫妻千萬不要離婚對于孩 小孩千萬別讓老人帶的說法正確嗎 自卑缺乏安全感的孩子怎么改善 怎么讓孩子開口說話 這幾個方法 怎么讓孩子吃飯 教你如何讓孩子 怎么管教不聽話的孩子 家長首先 頑皮的孩子怎么管教的 這些方法 叛逆期的孩子怎么管教 引導孩子 孩子性格軟弱怎么辦 懦弱的性格 孩子性格偏激怎么辦 孩子性格偏 孩子性格固執(zhí)怎么辦 家長們不妨 愛惹事的孩子怎么管教 不妨試試 養(yǎng)育優(yōu)秀的孩子具備特征,家長要 高考數(shù)學難出新天際,可有的孩子 “做胎教”和“不做胎教”的孩子 花費十幾萬只考了302分 媽媽覺得 甘肅作弊考生留下來的疑團,是怎 一舉奪魁!高三學生離校時,校領 高考釘子戶:26次參加高考,今年 D2809次列車因泥石流脫線!此類 “女兒16歲,學校宿舍里分娩了” 扭曲邪門的內容,頻頻出現(xiàn)在教科 川渝地區(qū)幾所大學實力很牛!四川