歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 深入淺出Linux之前言

深入淺出Linux之前言

日期:2017/2/28 16:00:06   编辑:Linux教程

中國人說“名正則言順”,說明了起名字的重要性。

前賢已經有了深入linux內核。我們後人,站在前賢的肩膀上,自然不敢稱“深入”,所以淺出就是本文的宗旨。

筆者這幾年來,先後組織了多個培訓講座或者交流之類的會議,面試超過百人,和國內多個公司的工程師有過交流,發現兩個有趣的現象:一是了解內核的人在國內總體上不多,很多人有過閱讀內核書籍或者內核的經歷,這裡面百分之九十的人在一個星期之內就放棄了。

二是大多數人認為內核在工作中用處不大,感覺用不起來。

針對第一個問題,筆者做過調查問卷,公認學習內核最大的問題就是內核代碼的難懂和跳躍。從一個函數跳到另一個函數,經常不清楚為何要執行某些邏輯,然後又跳到下一個函數。

跳躍超過三次,基本就看不下去,要放棄了。第二個問題和第一個問題強相關。因為對內核了解不夠系統,很難形成一個完整的內核執行邏輯圖。而工作中碰到的問題總是千變萬化,個人了解的一塊未必能碰到。比如一個文件系統只讀問題,是內核vfs層的問題?是文件系統自身?還是塊設備或者硬盤的問題?如果不能形成清晰的視圖,也就很難有針對性的檢查。

難學難用,這就涉及到方法論。通常人類的學習過程是從易到難,從部分到整體,從已知到未知。而內核的學習有特殊之處,眾多人反饋內核幾乎是九十度的學習曲線,極難找到入門的路徑,從而快速流暢的閱讀內核代碼。從那時起,筆者開始對內核開始整理,希望能找到一條學習的路徑,逐漸形成一份文檔。然後通過一些培訓活動逐漸驗證,最終形成了本文。

本文可以歸納為兩個思路。一個是對內核代碼的分類。筆者把內核分為基礎部分和應用部分。

中斷,內存管理,任務調度歸為基礎部分。而把文件系統,設備驅動和網絡歸為應用部分。打開一份完整的內核代碼統計一下,應用部分占了絕大多數代碼,龐大復雜,但是應用部分冗余很多,很多代碼具有相似性。而基礎部分則是短小精悍。應用部分經常要調用基礎部分提供的內存管理,任務調度等服務。所以本文把應用部分作為第一部分,而基礎部分作為第二部分。為了在應用部分能快速理解和應用基礎部分,首先要整理基礎部分的服務,理解在內核中是如何使用基礎部分的服務。

第二個思路是把內核分為內核架構和內核實現。內核架構是內核中一些通用,普遍性的層次,比如塊設備字符設備,總線,文件系統的vfs等等。理解了內核架構,就對內核有整體上的掌握,了解內核設計者的思路,進而快速流暢的閱讀內核代碼。但即使理解了內核架構,也還有很多具體問題要攻克。比如驅動中一個寄存器的使用,設備鏈路狀態如何檢測,或者文件系統如何使用不同的io類型,同步和異步io的區別等等。這是需要開發人員仔細研讀和理解的。本文試圖歸納整理出內核的常用架構層,這些架構層具有舉一反三的作用,它們構成了linux內核的骨架。

發展到今天,內核已經太龐大,太復雜。即使linus本人,也不可能閱讀全部的代碼。本文希望通過一些架構層次代碼的分析,結合簡單的例子,幫助讀者理解內核的整體框架。當碰到內核問題或者需要加入某些內核功能或者寫一個驅動的時候,可以迅速流暢的閱讀相關代碼,確定自己的方案,而不至於茫然無措。

而細節的實現,則需要程序員根據自己的需求來設計。

關於內核版本。我用的版本是2.6.18。內核有一套自己的不兼容策略,不同內核版本之間經常不能編譯。

至於函數沒了,數據結構變了更是家常便飯。所以我們只能選擇一個版本作為基礎。關於內核的不兼容設計思路的討論,有一篇很有意思的文章,大家可以在內核文檔中找到。

閱讀內核代碼前的准備:下載一份完整的內核。http://www.kernel.org/是linux內核的官方網站。可以下載到各個版本的內核。再准備一個好的代碼閱讀軟件。因為內核代碼經常要前後關聯來閱讀,所以要具有代碼工程管理的軟件。強烈推薦source insight。這也是國內應用很廣的一個軟件。另外,本文已經假設讀者能編譯和安裝模塊,具有計算機基本結構的知識。一台安裝了Linux系統的計算機或者虛擬機,以及經常地練習。

由於作者水平有限,而從架構層次分析內核代碼,確實是很少參考的一個工作,希望廣大讀者能多提意見,共同推進中國的技術水平。

Copyright © Linux教程網 All Rights Reserved