Linux內(nèi)核入門之路 (非廣告)
筆者從開始接觸 Linux 內(nèi)核應(yīng)該有 4 ~ 5 年了,雖然不敢說非常了解 Linux 內(nèi)核,但起碼也有了點(diǎn)眉目。所以,本文主要想分享一下我的 Linux 內(nèi)核入門之路,如果對大家有幫助的話,希望能夠轉(zhuǎn)發(fā)一下,幫助更多想學(xué)習(xí)內(nèi)核的同學(xué)們。
我的“碼農(nóng)”之路
本人大學(xué)的專業(yè)并不是計(jì)算機(jī)系,而是應(yīng)用化學(xué)。在機(jī)緣巧合下接觸到 PHP(那時候 PHP 還是挺火的),開始著迷地學(xué)習(xí) PHP,基本上把圖書館所有 PHP 的書籍都借回來了。
由于不是計(jì)算機(jī)專業(yè),所以只能在課堂偷偷看 PHP 的書(也不算偷看吧,因?yàn)楦緵]人會關(guān)注,哈哈)。并且開始自己寫一些留言板、小型論壇、博客之類的網(wǎng)站(那時是08-09年的時候,現(xiàn)在論壇好像消失了),也開始接觸 MySQL 數(shù)據(jù)庫。
當(dāng)然,寫些小論壇是不能滿足我的,所以不知天高地厚的我,開始看 PHP 是怎樣實(shí)現(xiàn)的。但一看發(fā)現(xiàn),全部都是 .c 的文件,我以前接觸的都是 .php 的,所以完全看不懂。Google一下才發(fā)現(xiàn)(那時還沒被墻的),原來是 .c 的文件是使用 C 語言編寫的。
OK,不懂就學(xué)咯,還好那時是大四,比較閑。就去圖書館借了本經(jīng)典的譚浩強(qiáng)版《C語言程序設(shè)計(jì)》,現(xiàn)在想起來,雖然這本書很多小錯誤,但還算比較通俗,不像C語言經(jīng)典之作 K&R 版本的《C程序設(shè)計(jì)語言》那么難懂。
PS:我覺得是不是好書的標(biāo)準(zhǔn)是,你能不能從中學(xué)習(xí)到知識。所以對我來說,譚浩強(qiáng)版的《C語言程序設(shè)計(jì)》還算是本好書。
C 語言學(xué)起來不難,但用起來真的 TMD 難(So!PHP 是世界上最好的語言!!!),不過我學(xué) C 語言也只是為了能看懂 PHP 源碼。對 C 語言有了一點(diǎn)基礎(chǔ)后,就開始看 PHP 的源碼,最開始看的是 PHP 3.0 版本。其實(shí)那時候還是看不懂的,而且資料少之又少。
我也忘記是怎么開始看懂的,反正有一天突然好像開竅一樣看懂了(難道是頓悟?),接著開始看 PHP 4.0 版本的源碼。
這就開始我的程序員(碼農(nóng))生涯...
畢業(yè)后一直從事 PHP 的開發(fā),由于不是計(jì)算機(jī)專業(yè),所以剛開始找工作挺困難的,只能從小公司做起(俗話說,萬事開頭難嘛)。
2011 年的時候,那時剛畢業(yè)2年,就開始不知天高地厚的想分享自己的經(jīng)驗(yàn)(年輕人就是不懂事啊),但想起來當(dāng)時好像也沒什么經(jīng)驗(yàn)分享... 就邀約了帥氣的白菜兄寫了本 PHP 的書籍《PHP核心技術(shù)與最佳實(shí)踐》。
為什么要學(xué) Linux 內(nèi)核?
說了那么多廢話,現(xiàn)在講講本人為什么要學(xué) Linux 內(nèi)核吧。因?yàn)榈谝患夜臼羌倚」荆院芏嗍虑槎家约喝ジ桑热纾壕幾g安裝 PHP 環(huán)境,安裝 MySQL 數(shù)據(jù)庫等(因?yàn)楫?dāng)時沒有云平臺,都是自己搭建機(jī)器的)。
這樣就開始接觸到 Linux 系統(tǒng),雖然大學(xué)也自己搗蛋過 Linux,但也沒怎么深入去了解。剛開始使用 Linux 的時候,用慣 Windows 的我覺得太 TMD 難用了。不過因?yàn)楣ぷ餍枰獩]辦法,硬著頭皮上。
用著用著,就出現(xiàn)很多奇怪的問題,比如文件系統(tǒng)的 inode 不足(當(dāng)時想,這是什么鬼...)。
好奇心的驅(qū)使下,又是不知天高地厚的我下載了最新版本的 Linux 源代碼(當(dāng)時應(yīng)該是 3.0 吧)。解壓后一看,傻眼了,簡直是天書一樣(因?yàn)楫?dāng)時也看了很長一段時間的 PHP 源碼,對 C 語言也有比較深的認(rèn)識),這還是我認(rèn)識的 C 語言嗎?所以,不得不放棄。
不過,懷著尋根問底的信念,我還是重新開始學(xué)習(xí) Linux 內(nèi)核。下面介紹一下我的學(xué)習(xí)之路。
Linux 內(nèi)核入門之路
有了上次的經(jīng)驗(yàn),這次我就從低版本的 Linux 學(xué)起,也就是 Linux 0.12。從 0.12 開始學(xué)起是因?yàn)?0.12 版本有本不錯的書籍介紹,就是《Linux內(nèi)核完全剖析》,下面就是它的封面:

其實(shí)剛開始看這本書的時候也有難度,主要是本人不是計(jì)算機(jī)專業(yè),所以硬件相關(guān)的知識面比較差。另外,內(nèi)核充斥著大量的匯編代碼,所以必須要先了解匯編語言。
直到發(fā)現(xiàn)《x86匯編語言-從實(shí)模式到保護(hù)模式》這本書,我才開始慢慢了解操作系統(tǒng)的原理,封面如下:

這本書解開我很多迷霧,比如實(shí)模式和保護(hù)模式,虛擬內(nèi)存與物理內(nèi)存映射等。這本書雖然非常好,但有個問題,就是 Linux 使用的是 AT&T 風(fēng)格的匯編,而這本書介紹的是 Intel 風(fēng)格的匯編。所以,要看內(nèi)核前,最好先了解下 AT&T 風(fēng)格的匯編,網(wǎng)上也挺多資料。
所以,我建議先看完《x86匯編語言-從實(shí)模式到保護(hù)模式》這本,然后再看《Linux內(nèi)核完全剖析》,那就基本能看懂 Linux 0.12 的源代碼了,看懂 Linux 0.12 就算是 Linux 內(nèi)核的入門了。
Linux 內(nèi)核進(jìn)階之路
看懂 Linux 0.12 后,就可以開始看高版本的內(nèi)核了。但在看高版本的內(nèi)核之前,最好先了解下現(xiàn)代 Linux 的設(shè)計(jì),所以我推薦下面這本書《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)》:

這本書介紹的是 Linux 2.6 版本,比較簡單,而且沒有過多的展示代碼。但缺點(diǎn)就是,只是大概介紹 Linux 的設(shè)計(jì),沒有很詳細(xì)的分析,不過作為入門是個不錯的選擇。
然后就是看 Linux 內(nèi)核最經(jīng)典的書籍:《深入理解Linux內(nèi)核》。

這本書是學(xué)習(xí)內(nèi)核必看的書籍,它非常詳細(xì)的分析了 Linux 內(nèi)核的原理和實(shí)現(xiàn),而且譯者是在 Linux 內(nèi)核方面很有建樹的“陳莉君”老師,翻譯質(zhì)量不錯。這本書也是以 Linux 2.6 作為分析對象的,看完這本書,就可以直接去看 Linux 代碼了。
還有嗎?
看完上面這 4 本書后,對內(nèi)核也有不錯的認(rèn)識了,當(dāng)然最重要還是要多看內(nèi)核源碼。如果看完上面這些書,還是覺得不是太懂,那么就要祭出神器了。就是下面這本:

為什么說這本書是神器?因?yàn)檫@本書是我看過分析內(nèi)核最詳細(xì)的書籍,詳細(xì)到你會覺得啰嗦。但缺點(diǎn)就是,使用的 Linux 版本太低(2.4.0),還有就是配圖有點(diǎn)少。
除了上面這本,我還要推薦一下《深入Linux內(nèi)核架構(gòu)》這本書:

這本書分析比較詳細(xì),而且版本也相對較高,這本書我覺得作為選讀吧,不看也沒什么關(guān)系,可以直接看 Linux 源碼。
最后說說
Linux 內(nèi)核的參考書就大概是上面這些了,當(dāng)然還有很多其他的書籍,但我認(rèn)為看完上面這些,再直接看源碼就好了,畢竟看源碼才能真正理解 Linux。
我們來總結(jié)一下讀上面這些書的順序:

格拉德威爾在《異類》一書中指出:人們眼中的天才之所以卓越非凡,并非天資超人一等,而是付出了持續(xù)不斷的努力,1萬小時的錘煉是任何人從平凡變成世界級大師的必要條件。
所以,不是天賦異稟的話,還是好好遵從“1萬小時定律”吧。
另外,如果你是剛?cè)腴T的同學(xué),建議把本文收藏起來,然后按照這個學(xué)習(xí)路徑來學(xué)習(xí),我覺得一定能學(xué)會 Linux 內(nèi)核的。
那么,學(xué)習(xí) Linux 內(nèi)核有什么用途?最明顯的就是面試時可以裝下逼吧,還可以在工作中解決一些奇怪的內(nèi)核問題。
