Linux內(nèi)核源碼如何學(xué)習(xí)?(含學(xué)習(xí)路線與資料~)
碼中自有顏如玉!
碼中自有黃金屋!
那么Linux內(nèi)核代碼到底有多少行?
我們怎么讀完呢?
https://www.kernel.org
一、內(nèi)核行數(shù)
Linux內(nèi)核分為CPU調(diào)度、內(nèi)存管理、網(wǎng)絡(luò)和存儲四大子系統(tǒng),針對硬件的驅(qū)動成百上千。代碼的數(shù)量更是大的驚人。
先說說最早的內(nèi)核linux 0.11,下面這本書可以說很多驅(qū)動工程師都學(xué)習(xí)過,我花了大概1個半月,勉強(qiáng)看了一遍。

再來看看內(nèi)核代碼量的統(tǒng)計(jì)。


2020年1月1日,Linux內(nèi)核Git源碼樹中的代碼達(dá)到了2780萬行。
phoronix網(wǎng)站統(tǒng)計(jì)了Linux內(nèi)核在進(jìn)入2020年時的一些源碼數(shù)據(jù)并作了總結(jié)。
從統(tǒng)計(jì)數(shù)據(jù)來看,Linux內(nèi)核源碼樹共有:
27852148行(包括文檔、Kconfig文件、樹中的用戶空間實(shí)用程序等)、
887925次commit
21074位不同的作者
2780萬行代碼分布在66492個文件中。
Linux內(nèi)核從最初的10000行代碼到現(xiàn)在的2780萬行代碼就是全球精英共同貢獻(xiàn)的結(jié)果。
按照一天一萬行的速度,也需要2700天,也需要7年多。
這還是建立在所有單次都認(rèn)識,
所有代碼邏輯看了的都懂,
而且都不忘記的基礎(chǔ)上。
實(shí)際上即使我們真的看完了,
幾年后內(nèi)核又會有非常大的變化,
可以說一輩子都看不完Linux內(nèi)核的代碼。

Linux內(nèi)核Git源碼樹中的代碼達(dá)到了2780萬行,核心代碼只有2%是由李納斯?托瓦茲自己編寫的,其他均是其他個人和組織貢獻(xiàn)的,李納斯?托瓦茲公開了Linux但保留了選擇新代碼和需要合并的新方法的最終裁定權(quán)。
除了Linus Torvalds,對內(nèi)核貢獻(xiàn)最多的是David S.Miller、 Mark Brown、Takashi Iwai、Arnd Bergmann、Al Viro和Mauro Carvalho Chehab。
而參與貢獻(xiàn)的公司,從域名統(tǒng)計(jì)來看,谷歌、Intel與Red Hat排在了最前列。
文末有學(xué)習(xí)路線參考!
【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦!?。。ê曨l教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)? ? ??


二、內(nèi)核目錄文件大小
然而,現(xiàn)在的內(nèi)核已經(jīng)膨脹的不成樣子了,以還不算最新的linux-4.1.15為例:
整個內(nèi)核源碼一共約 793M:

驅(qū)動代碼占了大概一半,大約380M:

體系相關(guān)的代碼大約134M:

網(wǎng)路子系統(tǒng)相關(guān)的代碼26M:

文件系統(tǒng)相關(guān)的代碼37M:

linux內(nèi)核核心代碼大約6.8M:

這些目錄任意一個目錄想完全看明白都非常不容易。
內(nèi)核源碼獲取
最新源碼離線下載:
https://www.kernel.org

三、內(nèi)核子系統(tǒng)
什么是內(nèi)核:
在計(jì)算機(jī)科學(xué)中是一個用來管理軟件發(fā)出的數(shù)據(jù)I/O(輸入與輸出)要求的計(jì)算機(jī)程序,將這些要求轉(zhuǎn)譯為數(shù)據(jù)處理的指令并交由中央處理器(CPU)及計(jì)算機(jī)中其他電子組件進(jìn)行處理,是現(xiàn)代操作系統(tǒng)中最基本的部分。

它是為眾多應(yīng)用程序提供對計(jì)算機(jī)硬件的安全訪問的一部分軟件,這種訪問是有限的,并由內(nèi)核決定一個程序在什么時候?qū)δ巢糠钟布僮鞫嚅L時間。
linux內(nèi)核代碼涉及知識點(diǎn)包括匯編指令、c語言、硬件組成原理、操作系統(tǒng)、數(shù)據(jù)結(jié)構(gòu)和算法、各種外設(shè)總線、驅(qū)動、網(wǎng)絡(luò)協(xié)議棧。
直接對硬件操作是非常復(fù)雜的。所以內(nèi)核通常提供一種硬件抽象的方法,來完成這些操作。
通過進(jìn)程間通信機(jī)制及系統(tǒng)調(diào)用,應(yīng)用進(jìn)程可間接控制所需的硬件資源(特別是處理器及IO設(shè)備)。

最上面是用戶(或應(yīng)用程序)空間。這是用戶應(yīng)用程序執(zhí)行的地方。用戶空間之下是內(nèi)核空間,Linux 內(nèi)核正是位于這里。
GNU C Library (glibc)也在這里。它提供了連接內(nèi)核的系統(tǒng)調(diào)用接口,還提供了在用戶空間應(yīng)用程序和內(nèi)核之間進(jìn)行轉(zhuǎn)換的機(jī)制。
內(nèi)核和用戶空間的應(yīng)用程序使用的是不同的保護(hù)地址空間。
每個用戶空間的進(jìn)程都使用自己的虛擬地址空間,而內(nèi)核則占用單獨(dú)的地址空間。
Linux 內(nèi)核可以進(jìn)一步劃分成 3 層。最上面是系統(tǒng)調(diào)用接口,它實(shí)現(xiàn)了一些基本的功能,例如 read 和 write。
系統(tǒng)調(diào)用接口之下是內(nèi)核代碼,可以更精確地定義為獨(dú)立于體系結(jié)構(gòu)的內(nèi)核代碼。這些代碼是 Linux 所支持的所有處理器體系結(jié)構(gòu)所通用的。
在這些代碼之下是依賴于體系結(jié)構(gòu)的代碼,構(gòu)成了通常稱為 BSP(Board Support Package)的部分。這些代碼用作給定體系結(jié)構(gòu)的處理器和特定于平臺的代碼。

內(nèi)核主要系統(tǒng)包括:SCI:系統(tǒng)調(diào)用接口 PM:進(jìn)程管理 VFS:虛擬文件系統(tǒng) MM:內(nèi)存管理 Network Stack:內(nèi)核協(xié)議棧 Arch:體系架構(gòu) DD:設(shè)備驅(qū)動
1 系統(tǒng)調(diào)用接口
SCI 層提供了某些機(jī)制執(zhí)行從用戶空間到內(nèi)核的函數(shù)調(diào)用。這個接口依賴于體系結(jié)構(gòu),甚至在相同的處理器家族內(nèi)也是如此。
SCI 實(shí)際上是一個非常有用的函數(shù)調(diào)用多路復(fù)用和多路分解服務(wù)。
在 ./linux/kernel 中您可以找到 SCI 的實(shí)現(xiàn),并在 ./linux/arch 中找到依賴于體系結(jié)構(gòu)的部分。
2 進(jìn)程管理
進(jìn)程管理的重點(diǎn)是進(jìn)程的執(zhí)行。
在內(nèi)核中,這些進(jìn)程稱為線程,代表了單獨(dú)的處理器虛擬化(線程代碼、數(shù)據(jù)、堆棧和 CPU 寄存器)。
在用戶空間,通常使用進(jìn)程 這個術(shù)語,不過 Linux 實(shí)現(xiàn)并沒有區(qū)分這兩個概念(進(jìn)程和線程)。
內(nèi)核通過 SCI 提供了一個應(yīng)用程序編程接口(API)來創(chuàng)建一個新進(jìn)程(fork、exec 或 Portable Operating System Interface [POSIX] 函數(shù)),停止進(jìn)程(kill、exit),并在它們之間進(jìn)行通信和同步(signal 或者 POSIX 機(jī)制)。
3 內(nèi)存管理
內(nèi)核所管理的另外一個重要資源是內(nèi)存。為了提高效率,如果由硬件管理虛擬內(nèi)存,內(nèi)存是按照所謂的內(nèi)存頁方式進(jìn)行管理的(對于大部分體系結(jié)構(gòu)來說都是 4KB)。

Linux 包括了管理可用內(nèi)存的方式,以及物理和虛擬映射所使用的硬件機(jī)制。
4 虛擬文件系統(tǒng)
虛擬文件系統(tǒng)(VFS)是 Linux 內(nèi)核中非常有用的一個方面,因?yàn)樗鼮槲募到y(tǒng)提供了一個通用的接口抽象。VFS 在 SCI 和內(nèi)核所支持的文件系統(tǒng)之間提供了一個交換層。

在 VFS 上面,是對諸如 open、close、read 和 write 之類的函數(shù)的一個通用 API 抽象。在 VFS 下面是文件系統(tǒng)抽象,它定義了上層函數(shù)的實(shí)現(xiàn)方式。
它們是給定文件系統(tǒng)(超過 50 個)的插件。文件系統(tǒng)的源代碼可以在 ./linux/fs 中找到。
文件系統(tǒng)層之下是緩沖區(qū)緩存,它為文件系統(tǒng)層提供了一個通用函數(shù)集(與具體文件系統(tǒng)無關(guān))。
這個緩存層通過將數(shù)據(jù)保留一段時間(或者隨即預(yù)先讀取數(shù)據(jù)以便在需要是就可用)優(yōu)化了對物理設(shè)備的訪問。緩沖區(qū)緩存之下是設(shè)備驅(qū)動程序,它實(shí)現(xiàn)了特定物理設(shè)備的接口。
5 網(wǎng)絡(luò)堆棧
網(wǎng)絡(luò)堆棧在設(shè)計(jì)上遵循模擬協(xié)議本身的分層體系結(jié)構(gòu)。

回想一下,Internet Protocol (IP) 是傳輸協(xié)議(通常稱為傳輸控制協(xié)議或 TCP)下面的核心網(wǎng)絡(luò)層協(xié)議。TCP 上面是 socket 層,它是通過 SCI 進(jìn)行調(diào)用的。
socket 層是網(wǎng)絡(luò)子系統(tǒng)的標(biāo)準(zhǔn) API,它為各種網(wǎng)絡(luò)協(xié)議提供了一個用戶接口。
從原始幀訪問到 IP 協(xié)議數(shù)據(jù)單元(PDU),再到 TCP 和 User Datagram Protocol (UDP),socket 層提供了一種標(biāo)準(zhǔn)化的方法來管理連接,并在各個終點(diǎn)之間移動數(shù)據(jù)。內(nèi)核中網(wǎng)絡(luò)源代碼可以在 ./linux/net 中找到。
6 設(shè)備驅(qū)動程序
Linux 內(nèi)核中有大量代碼都在設(shè)備驅(qū)動程序中,它們能夠運(yùn)轉(zhuǎn)特定的硬件設(shè)備。
Linux 源碼樹提供了一個驅(qū)動程序子目錄,這個目錄又進(jìn)一步劃分為各種支持設(shè)備,例如 Bluetooth、I2C、serial 等。設(shè)備驅(qū)動程序的代碼可以在 ./linux/drivers 中找到。
下面這個圖形象的講解了Linux內(nèi)核都有哪些東西!

四、如何學(xué)習(xí)內(nèi)核?
主要從
進(jìn)程管理專題
內(nèi)存管理專題
網(wǎng)絡(luò)協(xié)議棧專題
設(shè)備驅(qū)動管理專題
文件系統(tǒng)及內(nèi)核組件專題
全方面系統(tǒng)全面的講解底層原理開發(fā)技術(shù):
最新Linux內(nèi)核大綱
進(jìn)程管理專題

內(nèi)存管理專題

網(wǎng)絡(luò)協(xié)議棧專題

設(shè)備驅(qū)動管理專題

文件系統(tǒng)及內(nèi)核組件專題

項(xiàng)目實(shí)戰(zhàn)

適合于
1.從事業(yè)務(wù)開發(fā)多年,對底層原理理解不夠深入的在職工程師
2. 從事嵌入式方向開發(fā),想轉(zhuǎn)入互聯(lián)網(wǎng)開發(fā)的在職工程師
3. 從事Qt/MFC等桌面開發(fā),薪資多年漲幅不大的在職工程師
4. 從事非開發(fā)崗位(算法崗,運(yùn)維崗,測試崗),想轉(zhuǎn)后臺開發(fā)崗位的在職工程師
5. 工作中技術(shù)沒有挑戰(zhàn),工作中接觸不到新技術(shù)的在職工程師
6. 自己研究學(xué)習(xí)速度較慢,不能系統(tǒng)構(gòu)建知識體系的開發(fā)人員
7. 了解很多技術(shù)名詞,但是深入細(xì)問又不理解的工程師
8. 計(jì)算機(jī)相關(guān)專業(yè)想進(jìn)入大廠的在校生(本科及以上學(xué)歷,有c/c++基礎(chǔ))