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 此目錄包含了所有的記憶體管理程式碼。與具體硬體體系結構相關的記憶體管理程式碼位於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()。而對於象記憶體管理等部分,則可以單獨拿出來進行閱讀分析。我的體會是:開始最好按順序閱讀啟動程式碼,然後進行專題閱讀,如程式部分,記憶體管理部分等。在每個功能函式內部應該一步步來。實際上這是一個反覆的過程,不可能讀一遍就理解。
俗話說:“工欲善其事,必先利其器”。 閱讀象Linux核心程式碼這樣的複雜程式令人望而生畏。它象一個越滾越大的雪球,閱讀核心某個部分經常要用到好幾個其他的相關檔案,不久你將會忘記你原來在幹什麼。所以沒有一個好的工具是不行的。由於大部分愛好者對於Window平臺比較熟悉,並且還是常用Window系列平臺,所以在此我介紹一個Window下的一個工具軟體:Source Insight。這是一個有30天免費期的軟體,可以從下載。安裝非常簡單,和別的安裝一樣,雙擊安裝檔名,然後按提示進行就可以了。安裝完成後,就可啟動該程式。這個軟體使用起來非常簡單,是一個閱讀原始碼的好工具。它的使用簡單介紹如下:先選擇Project選單下的new,新建一個工程,輸入工程名,接著要求你把欲讀的原始碼加入(可以整個目錄加)後,該軟體就分析你所加的原始碼。分析完後,就可以進行閱讀了。對於開啟的閱讀檔案,如果想看某一變數的定義,先把游標定位於該變數,然後點選工具條上的相應選項,該變數的定義就顯示出來。對於函式的定義與實現也可以同樣操作。別的功能在這裡就不說了,有興趣的朋友可以裝一個Source Insight,那樣你閱讀原始碼的效率會有很大提高的。怎麼樣,試試吧!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-940303/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ArrayList相關方法介紹及原始碼分析原始碼
- 閱讀linux原始碼的工具---lxr和glimpse簡介(轉)Linux原始碼
- TiCDC 原始碼閱讀(二)TiKV CDC 模組介紹原始碼
- 原始碼閱讀工具-understand原始碼
- RTSP 流相關工具介紹
- 以太坊:Dapp及相關開發工具介紹APP
- Laravel 原始碼閱讀指南 -- HTTP 核心Laravel原始碼HTTP
- GVUserDefaults原始碼閱讀及使用原始碼
- 【原始碼閱讀】AndPermission原始碼閱讀原始碼
- 分享一些閱讀Java相關框架原始碼的經驗Java框架原始碼
- 為什麼要閱讀核心原始碼?原始碼
- weex-toolkit工具的相關命令介紹
- linux使用者及組相關檔案介紹Linux
- linux的vm相關引數介紹Linux
- DM 原始碼閱讀系列文章(二)整體架構介紹原始碼架構
- Scrapy原始碼閱讀分析_1_整體框架和流程介紹原始碼框架
- Scrapy原始碼閱讀分析_3_核心元件原始碼元件
- linux中時間相關的函式介紹Linux函式
- JEECMS原始碼基本結構及相關技術簡介原始碼
- Linux核心的framebuffer相關的核心程式碼註釋Linux
- (轉)Linux 核心引數及Oracle相關引數調整LinuxOracle
- Laravel 原始碼閱讀指南 -- Console 核心Laravel原始碼
- Nginx 相關介紹Nginx
- ReentrantLock介紹及原始碼解析ReentrantLock原始碼
- 【原始碼閱讀】Glide原始碼閱讀之with方法(一)原始碼IDE
- 【原始碼閱讀】Glide原始碼閱讀之into方法(三)原始碼IDE
- Android原始碼分析相關工具Android原始碼
- Laravel 原始碼閱讀指南 -- 使用者認證系統 (基礎介紹)Laravel原始碼
- Spring原始碼分析——spring原始碼核心方法refresh()介紹Spring原始碼
- HTTP/2標準釋出及相關介紹HTTP
- [Linux]使用者及密碼相關命令(轉)Linux密碼
- LINUX核心及升級簡介(轉)Linux
- 【核心檔案系統】原始碼閱讀stat.h原始碼
- ReactorKit原始碼閱讀React原始碼
- AQS原始碼閱讀AQS原始碼
- CountDownLatch原始碼閱讀CountDownLatch原始碼
- HashMap 原始碼閱讀HashMap原始碼
- delta原始碼閱讀原始碼