【轉載】 Linux內核源碼閱讀以及工具

                  Linux內核源碼閱讀以及工具


原文【轉載】:http://blog.sina.com.cn/s/blog_510219d701008yrl.html


隨着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界面。在工具條上有幾個值得注意的地方,如圖所示,圖中內凹左邊的是工程按鈕,用於顯示工程窗口的情況;右邊的那個按鈕按下去將會顯示一個窗口,裏邊提供光標所在的函數體內對其他函數的調用圖,通過點擊該窗體裏那些函數就可以進入該函數所在的地方。
   

Linux內核源碼閱讀以及工具
圖1 
Source Insight界面圖
  由於Source 
Insight實質上是一個支持多種開發語言(java,c ,c++等等)的編輯器,只不過由於其查找、定位、彩色顯示等功能的強大,而被我們當成源代碼閱讀工具使用。所以,爲了有效的閱讀源程序,首先必須選擇功能菜單上的 “Project”選項的子菜單“New Project”新建一個項目,項目名稱可以自由選定,當然也可以選擇刪除(Remove)一個項目。當刪除一個項目的時候,並不刪除原有的源代碼文件,只是將該軟件生成的那些工程輔助文件刪除。設定之後,將會彈出一個對話框如圖2,接受默認選擇,如果,硬盤空間足夠,可以將第一個複選框選上,該選項將會需要與源代碼大致同等的空間來建立一個本地數據庫以加快查找的速度。
   

Linux內核源碼閱讀以及工具 

圖2 
工程設置
  點擊“OK”按鈕,接受選擇後,將會有一個新的對話框彈出,在這個對話框裏,可以選擇將要閱讀的文件加入工程,一種方式是通過在File 
Name中輸入要閱讀源代碼文件的名稱,點擊“Add”按鈕將其加入,也可以通過其中“Add All”和“Add Tree”兩個按鈕可以將選中目錄的所有文件加入到工程中,其中“Add All”選項會提示加入頂層文件和遞歸加入所有文件兩種方式,而“Add Tree”相當於“Add All”選項的遞歸加入所有文件,可以根據需要使用,就我來說,更喜歡“Add Tree”一些。由於該程序採用了部分打開文件的方式,沒有用到的文件不會打開,所以,加入數千個文件也不用擔心加入的文件超出程序的所能容忍的最大值,我就是採用“Add Tree”的方式將Linux2.4內核的四千五百九十一個文件加入的。
   
Linux內核源碼閱讀以及工具
   

圖3 
添加文件
  加入文件後,點擊一個文件,可以出現使用界面,如圖4所示,其中,右邊的那個窗口(Linux 
Project,即工程窗口)缺省按照字母順序列出當前工程中所有的文件。
   

  Linux內核源碼閱讀以及工具  

圖4 
工作窗口
  點擊一個文件就可以打開該文件,顯示如圖5所示,進入到右邊的那個窗口分別可以以文件列表的方式,列出所有的文件,每個窗體下邊有一排按鈕,左邊的窗口(21142.c)從左至右分別爲:按字母順序排列所有標記、按照文件中行數順序排列標記、按照類型排列標記、瀏覽本地文件標記、標記窗口屬性。右邊的窗口(Linux 
Project)從左至右分別爲:按字母順序文件列表、顯示文件夾、按照文件類型歸類文件、全部文件的所有標記列表、按照標記類型歸類標記、跳轉到定義處、顯示標記信息、瀏覽工程標記、查找函數調用、工程屬性,其中全部文件的所有標記列表選項可能要一段時間抽取標記,同步到數據庫去,如果開始選擇了建立標記數據庫,將會在今後節省同步時間,最有用的莫過於瀏覽標記信息和查找函數調用,前者可以通過“Jump”按鈕在不同的地方查找同樣的標誌,還可以通過“Reference”按鈕結合後者進行全局的標記查找。
   
Linux內核源碼閱讀以及工具
 
  Reference功能是Source 
Insight的特色之一,它可以在速度極快的在整個工程中找到所有的標記,並且在該行程序的前邊加上紅色箭頭的小按鈕鏈接上。圖6是一個Reference搜索後的結果,它可以有兩種模式,一種集中顯示結果,圖6顯示的就是這種模式,在這種模式下,可以通過前邊的紅色箭頭小按鈕進入另外一種模式,該標記的具體的所在處,也可以通過標記的具體所在處點擊紅色箭頭小按鈕進入警種模式,還可以通過工具條上的兩個紅色小箭頭直接在第二種模式下前後移動,察看相應信息。它的這個強大的功能使得閱讀Linux源程序有如神助。但是要注意的是,當進行了第二次“Reference”時,它會提示你將結果集附加在第一個結果集的後邊還是取代第一個結果集。如果選擇前者,不能對結果集根據前後兩次搜索結果進行分類,然後在其子類裏進行移動,只能在整個結果集裏移動;如果,選擇後者,結果集將會被替換爲第二次搜索的結果,略微有些不方便。
   
Linux內核源碼閱讀以及工具
   

圖6 
Reference的搜索結果







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