Source Insight打開linux內核源代碼

用Source Insight打開Linux內核源代碼

2008-01-09 19:06

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 此目錄包含了所有的內存管理代碼。與具體硬件體系結構相關的內存管理代碼位於arch/*/mm目錄下,如對應於X86的就是arch/i386/mm/fault.c 。

  drivers 系統中所有的設備驅動都位於此目錄中。它又進一步劃分成幾類設備驅動,每一種也有對應的子目錄,如聲卡的驅動對應於drivers/sound。

  ipc 此目錄包含了核心的進程間通訊代碼。

  modules 此目錄包含已建好可動態加載的模塊。

  fs Linux支持的文件系統代碼。不同的文件系統有不同的子目錄對應,如ext2文件系統對應的就是ext2子目錄。

  kernel 主要核心代碼。同時與處理器結構相關代碼都放在arch/*/kernel目錄下。

  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()。而對於象內存管理等部分,則可以單獨拿出來進行閱讀分析。我的體會是:開始最好按順序閱讀啓動代碼,然後進行專題閱讀,如進程部分,內存管理部分等。在每個功能函數內部應該一步步來。實際上這是一個反覆的過程,不可能讀一遍就理解。     

安 裝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”時,它會提示你將結果集附加在第一個結果集的後邊還是取代第一個結果集。如果選擇前者,不能對結果集根據前後兩次搜索結果進行分類,然後在其子類裏進行移動,只能在整個結果集裏移動;如果,選擇後者,結果集將會被替換爲第二次搜索的結果,略微有些不方便。
圖6 Reference的搜索結果

當 然,Source Insight 還提供了一些其他常見的便利。比如:右鍵菜單幾乎包含了程序的所有功能,可以在編輯窗口爲程序加上行號,還可以統計整個工程的程序行數,當然還有功能強大卻用不上自動完成功能,似乎連它的30天試用期也是別有用心――可以迫使你儘可能快速的閱讀源程序,其他一些技巧大家可以在使用過程中慢慢摸索。怎麼樣?愛好讀源代碼的朋友,不妨馬上去下載一個,去開始我們的Linux內核探險之旅吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章