1. 程式人生 > >Linux核心原始碼閱讀

Linux核心原始碼閱讀

    隨著linux的逐步普及,現在有不少人對於Linux的安裝及設定已經比較熟悉了。與Linux 的蓬勃發展相適應,想深入瞭解Linux的也越來越多。而要想深入瞭解Linux,就需要閱讀和分析linux核心的原始碼。

  Linux的核心原始碼可以從很多途徑得到。一般來講,在安裝的linux系統下,/usr/src/linux目錄下的東西就是核心原始碼。另外還可以從互連網上下載,解壓縮後文件一般也都位於linux目錄下。核心原始碼有很多版本,目前最新的穩定版是2.2.14。

  許多人對於閱讀Linux核心有一種恐懼感,其實大可不必。當然,象Linux核心這樣大而複雜的系統程式碼,閱讀起來確實有很多困難,但是也不象想象的那麼高不可攀。只要有恆心,困難都是可以克服的。也不用擔心水平不夠的問題,事實上,有很多事情我們不都是從不會到會,邊幹邊學的嗎?

  任何事情做起來都需要有方法和工具。正確的方法可以指導工作,良好的工具可以事半功倍。對於Linux 核心原始碼的閱讀也同樣如此。下面我就把自己閱讀核心原始碼的一點經驗介紹一下,最後介紹Window平臺下的一種閱讀工具。

  對於原始碼的閱讀,要想比較順利,事先最好對原始碼的知識背景有一定的瞭解。對於linux核心原始碼來講,我認為,基本要求是:1、作業系統的基本知識;2、對C語言比較熟悉,最好要有組合語言的知識和GNU C對標準C的擴充套件的知識的瞭解。另外在閱讀之前,還應該知道Linux核心原始碼的整體分佈情況。我們知道現代的作業系統一般由程序管理、記憶體管理、檔案系統、驅動程式、網路等組成。看一下Linux內  核原始碼就可看出,各個目錄大致對應了這些方面。Linux核心原始碼的組成如下(假設相對於linux目錄):

  arch 這個子目錄包含了此核心原始碼所支援的硬體體系結構相關的核心程式碼。如對於X86平臺就是i386。

  include 這個目錄包括了核心的大多數include檔案。另外對於每種支援的體系結構分別有一個子目錄。

  init 此目錄包含核心啟動程式碼。

  mm 此目錄包含了所有的記憶體管理程式碼。與具體硬體體系結構相關的記憶體管理程式碼位於archkernel目錄下。

  net 核心的網路部分程式碼。裡面的每個子目錄對應於網路的一個方面。

  lib 此目錄包含了核心的庫程式碼。與處理器結構相關庫程式碼被放在arch/*/lib/目錄下。

  scripts此目錄包含用於配置核心的指令碼檔案。

  Documentation 此目錄是一些文件,起參考作用。

  清楚了原始碼的結構組成後就可以著手閱讀。對於閱讀方法或者說順序,有所謂的縱向與橫向之分。所謂縱向就是順著程式的執行順序逐步進行;所謂橫向,就是分模組進行。其實他們之間不是絕對的,而是經常結合在一起進行。對於Linux原始碼來講,啟動的程式碼就可以順著linux的啟動順序一步一步來,它的大致流程如下(以X86平臺為例):

  ./larch/i386/boot/bootSect.S–>./larch/i386/boot/setup.S–>./larch/i386/kernel/head.S–>./init/main.c中的start_kernel()。而對於象記憶體管理等部分,則可以單獨拿出來進行閱讀分析。我的體會是:開始最好按順序閱讀啟動程式碼,然後進行專題閱讀,如程序部分,記憶體管理部分等。在每個功能函式內部應該一步步來。實際上這是一個反覆的過程,不可能讀一遍就理解。

  俗話說:”工欲善其事,必先利其器”。 閱讀象Linux核心程式碼這樣的複雜程式令人望而生畏。它象一個越滾越大的雪球,閱讀核心某個部分經常要用到好幾個其他的相關檔案,不久你將會忘記你原來在幹什麼。所以沒有一個好的工具是不行的。由於大部分愛好者對於Window平臺比較熟悉,並且還是常用Window系列平臺,所以在此我介紹一個Window下的一個工具軟體:Source Insight。這是一個有30天免費期的軟體,可以從www.sourcedyn.com下載。安裝非常簡單,和別的安裝一樣,雙擊安裝檔名,然後按提示進行就可以了。安裝完成後,就可啟動該程式。這個軟體使用起來非常簡單,是一個閱讀原始碼的好工具。它的使用簡單介紹如下:先選擇Project選單下的new,新建一個工程,輸入工程名,接著要求你把欲讀的原始碼加入(可以整個目錄加)後,該軟體就分析你所加的原始碼。分析完後,就可以進行閱讀了。對於開啟的閱讀檔案,如果想看某一變數的定義,先把游標定位於該變數,然後點選工具條上的相應選項,該變數的定義就顯示出來。對於函式的定義與實現也可以同樣操作。別的功能在這裡就不說了,有興趣的朋友可以裝一個Source Insight,那樣你閱讀原始碼的效率會有很大提高的。怎麼樣,試試吧!

下面主要講解如何使用Source Insight,考慮到閱讀源程式的愛好者都有相當的軟體使用水平,本文對於一些瑣碎、人所共知的細節略過不提,僅介紹一些主要內容,以便大家能夠很快熟練使用本軟體,減少摸索的過程。
  安裝Source Insight並啟動程式,可以進入圖1介面。在工具條上有幾個值得注意的地方,如圖所示,圖中內凹左邊的是工程按鈕,用於顯示工程視窗的情況;右邊的那個按鈕按下去將會顯示一個視窗,裡邊提供游標所在的函式體內對其他函式的呼叫圖,通過點選該窗體裡那些函式就可以進入該函式所在的地方。
   

圖1 Source Insight介面圖
  由於Source Insight實質上是一個支援多種開發語言(java,c ,c++等等)的編輯器,只不過由於其查詢、定位、彩色顯示等功能的強大,而被我們當成原始碼閱讀工具使用。所以,為了有效的閱讀源程式,首先必須選擇功能選單上的 “Project”選項的子選單“New Project”新建一個專案,專案名稱可以自由選定,當然也可以選擇刪除(Remove)一個專案。當刪除一個專案的時候,並不刪除原有的原始碼檔案,只是將該軟體生成的那些工程輔助檔案刪除。設定之後,將會彈出一個對話方塊如圖2,接受預設選擇,如果,硬碟空間足夠,可以將第一個複選框選上,該選項將會需要與原始碼大致同等的空間來建立一個本地資料庫以加快查詢的速度。
   
 
圖2 工程設定
  點選“OK”按鈕,接受選擇後,將會有一個新的對話方塊彈出,在這個對話方塊裡,可以選擇將要閱讀的檔案加入工程,一種方式是通過在File Name中輸入要閱讀原始碼檔案的名稱,點選“Add”按鈕將其加入,也可以通過其中“Add All”和“Add Tree”兩個按鈕可以將選中目錄的所有檔案加入到工程中,其中“Add All”選項會提示加入頂層檔案和遞迴加入所有檔案兩種方式,而“Add Tree”相當於“Add All”選項的遞迴加入所有檔案,可以根據需要使用,就我來說,更喜歡“Add Tree”一些。由於該程式採用了部分開啟檔案的方式,沒有用到的檔案不會開啟,所以,加入數千個檔案也不用擔心加入的檔案超出程式的所能容忍的最大值,我就是採用“Add Tree”的方式將Linux2.4核心的四千五百九十一個檔案加入的。
   
   
圖3 新增檔案
  加入檔案後,點選一個檔案,可以出現使用介面,如圖4所示,其中,右邊的那個視窗(Linux Project,即工程視窗)預設按照字母順序列出當前工程中所有的檔案。
   
    
圖4 工作視窗
  點選一個檔案就可以開啟該檔案,顯示如圖5所示,進入到右邊的那個視窗分別可以以檔案列表的方式,列出所有的檔案,每個窗體下邊有一排按鈕,左邊的視窗(21142.c)從左至右分別為:按字母順序排列所有標記、按照檔案中行數順序排列標記、按照型別排列標記、瀏覽本地檔案標記、標記視窗屬性。右邊的視窗(Linux Project)從左至右分別為:按字母順序檔案列表、顯示資料夾、按照檔案型別歸類檔案、全部檔案的所有標記列表、按照標記型別歸類標記、跳轉到定義處、顯示標記資訊、瀏覽工程標記、查詢函式呼叫、工程屬性,其中全部檔案的所有標記列表選項可能要一段時間抽取標記,同步到資料庫去,如果開始選擇了建立標記資料庫,將會在今後節省同步時間,最有用的莫過於瀏覽標記資訊和查詢函式呼叫,前者可以通過“Jump”按鈕在不同的地方查詢同樣的標誌,還可以通過“Reference”按鈕結合後者進行全域性的標記查詢。
   
 
  Reference功能是Source Insight的特色之一,它可以在速度極快的在整個工程中找到所有的標記,並且在該行程式的前邊加上紅色箭頭的小按鈕連結上。圖6是一個Reference搜尋後的結果,它可以有兩種模式,一種集中顯示結果,圖6顯示的就是這種模式,在這種模式下,可以通過前邊的紅色箭頭小按鈕進入另外一種模式,該標記的具體的所在處,也可以通過標記的具體所在處點選紅色箭頭小按鈕進入警種模式,還可以通過工具條上的兩個紅色小箭頭直接在第二種模式下前後移動,察看相應資訊。它的這個強大的功能使得閱讀Linux源程式有如神助。但是要注意的是,當進行了第二次“Reference”時,它會提示你將結果集附加在第一個結果集的後邊還是取代第一個結果集。如果選擇前者,不能對結果集根據前後兩次搜尋結果進行分類,然後在其子類裡進行移動,只能在整個結果集裡移動;如果,選擇後者,結果集將會被替換為第二次搜尋的結果,略微有些不方便。
   
   文章來源:
http://blog.sina.com.cn/s/blog_510219d701008yrl.html