內(nèi)核是一個讓人既愛又恨的東西.
讀書的時候,我就一直就想讀一下內(nèi)核的源碼,但是那個時候真的只能說基礎(chǔ)薄弱,而且從來沒有接觸過那么大的一個項目,不知從何入手,所以這個計劃就一直被擱淺.我曾經(jīng)跟著公開課鼓搗過好幾份內(nèi)核源碼,但是那些源碼只是玩具一樣的東西,和真實環(huán)境中使用的內(nèi)核不可同日而語.不得不說,不能深入虎穴,實乃人生一大憾事.
出學(xué)校的第一份工作和網(wǎng)絡(luò)有著千絲萬縷的關(guān)系.雖然第一年做的東西和內(nèi)核不太相關(guān),可是越到后面,越發(fā)現(xiàn),如果不能正確理解內(nèi)核,我很難做好手中這份工作,畢竟,一個做網(wǎng)絡(luò)的人,怎么能對內(nèi)核協(xié)議棧過分生疏呢?因此,大致從第1年起,我就找了一些linux方面的書,想著邊看代碼,邊看書,相得益彰.由于工作的忙忙碌碌棵逊,第一遍滾內(nèi)核協(xié)議棧的路程辆影,斷斷續(xù)續(xù)黍特,一走就是1年多灭衷。 要說收獲吧,也有迫像,我只是加深了對內(nèi)核協(xié)議棧的了解,這種了解并不是很全面,每一個知識點都離散開來,雖然遍地開花,但是連不成片,構(gòu)不成面,總覺得還差了點啥。
第一遍走完菌羽,感受還是不怎么深由缆,然后進(jìn)入第二年均唉,發(fā)現(xiàn)技術(shù)上面,時常要處理一些linux相關(guān)的問題署鸡,包括arp限嫌,cpu占用高等怒医,為了了解這些東西,我又硬著頭皮去回顧了一下linux內(nèi)核協(xié)議棧焰薄。順帶還買了一些評分比較高的書籍對照著看,包括linux驅(qū)動架構(gòu),cpu運行原理等.
就這樣扒袖,斷斷續(xù)續(xù)又過了一段時間季率。終于到了今年這段時間,在了解了軟中斷鞭光,硬中斷泞遗,中斷向量史辙,地址映射等概念之后佩伤,我突然發(fā)現(xiàn)卦睹,雖然還是有些困難结序,內(nèi)核代碼確實已經(jīng)可以讀下去了纵潦。內(nèi)核是一個整體,知道了一些核心的知識之后,原來離散的知識點連成了片,構(gòu)成了面,整個協(xié)議棧的運行流程我已經(jīng)比較清晰了,報文怎么轉(zhuǎn)發(fā),怎么發(fā)送也有大致的了解,現(xiàn)在唯一欠缺的,就是更加深入的去琢磨每一個小的知識點,比如聚合口的實現(xiàn),網(wǎng)橋的實現(xiàn),tcp協(xié)議的實現(xiàn),路由的實現(xiàn).那些東西終究不算太難,花一些時間,總是可以摸得很清楚的.
現(xiàn)在看來,linux內(nèi)核其實并沒有那么可怕,我們其實也并不需要將所有代碼都一一讀完,比如你做網(wǎng)絡(luò),就只需要讀協(xié)議棧即可,這里總的代碼量,估計不超過4w,比上層應(yīng)用庫的大小小多了.
如果你也想讀的話,我這里給一些建議:
1.我建議你先了解一下linux的基礎(chǔ)設(shè)施,包括自旋鎖,等待隊列,定時器,硬中斷,軟中斷這些內(nèi)容,這些算是基礎(chǔ),了解這些之后,后面讀起來會輕松很多.
- 在讀相關(guān)模塊之前,先了解一下相關(guān)領(lǐng)域的知識,比如在讀tcp模塊之前,你最起碼要知道tcp有哪些字段,每個頭部選項怎么使用,在你沒有相關(guān)知識之前,不建議去強讀,收益不大.
其實內(nèi)核的代碼實現(xiàn)很優(yōu)秀,比我們某些程序員寫的代碼容易讀多了.算了,寫了這么多,我其實就想感慨一句:
今天,我終于站到了這里,今天,我終于有能力一探內(nèi)核的方方面面,好的,那就開始吧,不用害怕.