新冠疫情讓筆者不由回憶起10多年前甲流流行的那段過往。也就是那時,在封閉的大學宿舍裏,筆者開啓了本身的編程之旅。linux
初涉編程時那個C語言展現hello world的黑框並無激起筆者的任何興趣。爲何寥寥幾句就可在屏幕上展現輸出成爲縈繞筆者心頭的一個疑問。在全校封閉、沒法組團dota、百無聊賴的境遇下,筆者開始着手去探索這一謎題。在學校書店入手了王爽編寫的<<彙編語言>>算法
讀完並實踐以後,揭開了計算機原理的冰山一角,今後一發不可收拾的愛上編程,尤爲享受那種努力探索後恍然大悟的快感! 緊接着,開始彙編的第二本書:編程
使筆者學到了win32彙編的各類知識,意識到彙編的強大和其直接操縱底層的犀利。網絡
在實際編寫彙編時,深感其表現力方面的不便,例如一個浮點操做就須要專門的指令。因而又老老實實滾回去修煉C語言,入手了基本經典的書籍進行學習:數據結構
此次修煉毫無障礙,對於彙編的學習讓筆者不知不覺突破了指針這個大關。固然與C語言配套的必須還有數據結構和算法:架構
學完C語言後,也到了大學裏教授操做系統課的時候,課上用的教材是<<操做系統- 精髓與設計原理>>,同時筆者本身也搞了本<<現代操做系統>>研讀。socket
學完上述兩本後,心中涌起了造輪子的慾望,因而入手了下面這本:數據結構和算法
書中事無鉅細的講解讓筆者一步一步從保護模式到進程實現再到鍵盤輸入等完成了一個簡單的toyos。這本書知足了筆者造輪子的願望,就像書中說的那樣,這一切的探索僅僅是從最原始的好奇心開始。tcp
筆者讀的是通訊工程專業。天然的在下一步的學習中選擇了網絡編程。而網絡編程書籍當中最經典的必須是UNP(配合APUE的前置學習效果更佳)。ide
至今筆者所遇到的大部分網絡編程模型依舊逃不出UNP的藩籬。
(注:APUE->UNIX環境高級編程,UNP->UNIX網絡編程)
學完上述書籍後,天然又有了新的疑問,套接字(socket)底層是如何實現的?tcp/ip又是怎樣工做的?因而筆者又開始探索起關於協議棧的內容。最早閱讀的是Douglas E.Comer的<<用TCP/IP進行網際互聯>>三卷,筆者我的以爲很是適合入門。
就着上面書中的第二卷,筆者完成了第一個協議棧(XINU)的分析。
閱讀完上面三卷後,意猶未盡,畢竟XINU是個並不流行的操做系統,因而捧起了TCPIP詳解三卷。
其中卷二的tcpip實現基於BSD4.4-lite源碼,無疑是tcpip最爲普遍的實現,更加貼近現實。筆者花了大量的時間閱讀了tcpip詳解卷二,同時分析了BSD4.4的網絡子系統。在此基礎上,還順帶分析了專用於嵌入式的lwip協議棧。同時小試牛刀,解決了raw-os(某實時操做系統)適配lwip協議時關於free arp的一個初始化bug。Debug lwip協議棧的那個下午如今回想起來依舊使人心潮澎湃。
工做後基本都在和linux打交道。按筆者一探到底的精神必然研讀起linux內核。首先是啃了好幾本大部頭的linux內核著做。
第一本,<<linux內核設計與實現>>(縮寫lkd)比較薄,用來入門比較合適,可以創建起基本的linux內核圖景。
第二本,<<深刻理解Linux內核>>(縮寫ulk)很厚,囊括了linux各個基本的子系統模塊和其具體的實現機制,確實作到了深刻理解這幾個字。
第三本,<<深刻linux內核架構>>(縮寫PLKA)更厚。其於上面的<<深刻linux內核>>相輔相成,ulk詳細闡述的其一筆帶過,ulk遺漏但重要的PLKA對其作了詳細解釋。
最後一本<<Linux內核源代碼情景分析>>是國人寫的,也很是不錯,只是內核版本(2.4)有點老了,不過也是很是不錯的補充。
讀完上述三本,應該算對內核應該有個基本的入門了吧。下面就是深刻到內核的各個子模塊的代碼實現裏了,因而筆者又讀了:
第一本<<Linux網絡技術內幕>>幫筆者梳理了linux內核網絡子模塊的各類關鍵代碼路徑。
第二本<<深刻理解Linux虛擬內存管理>>雖然中文翻譯的不太好,但確實是本好書,配合英文版幫筆者夯實了虛擬內存的基礎。
第三本<<Linux設備驅動程序>>算是一個補充吧,因爲筆者並不搞驅動,因此經過這本書瞭解下Linux驅動究竟是怎麼運行的。
書籍只能帶你走進內核,而深刻內核則必須閱讀the fucking source code!不一樣操做系統以及同操做系統不一樣內核版本間實現的各類細節會致使一些細微的差異,而這些差異真是書中得來的知識和實踐的距離,剖析疑難問題有時必須在源碼中尋覓才能抓住關鍵的線索。
筆者平常工做中很大一部分精力是解決疑難雜症,在遇到一些很底層的問題時每每會從內核源碼着手,因而便有了博客裏的一篇篇博文。
看到這裏,你們會覺得筆者一直在用C語言。其實筆者在工做中用到最多的是用JAVA寫中間件(帶gc的語言就是香),筆者不斷探索的經歷成爲了平常開發中極大的助力,不少號稱複雜的概念機制徹底阻擋不了筆者的腳步,多是因爲筆者對未知樂此不疲的探索不知不覺跨越了不少障礙吧。