Linux內(nèi)核分析方法談(下2).doc

Linux內(nèi)核分析方法談(下2).doc

ID:51691196

大小:55.00 KB

頁數(shù):9頁

時間:2020-03-15

Linux內(nèi)核分析方法談(下2).doc_第1頁
Linux內(nèi)核分析方法談(下2).doc_第2頁
Linux內(nèi)核分析方法談(下2).doc_第3頁
Linux內(nèi)核分析方法談(下2).doc_第4頁
Linux內(nèi)核分析方法談(下2).doc_第5頁
資源描述:

《Linux內(nèi)核分析方法談(下2).doc》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在工程資料-天天文庫。

1、方法之四:以功能為中心,各個擊破  從功能上看,整個Linux系統(tǒng)可看作有一下幾個部分組成:進程管理機制部分;內(nèi)存管理機制部分;文件系統(tǒng)部分;硬件驅(qū)動部分;系統(tǒng)調(diào)用部分等;  以功能為中心、各個擊破,就是指從這五個功能入手,通過源碼分析,找出Linux是怎樣實現(xiàn)這些功能的。  在這五個功能部件中,系統(tǒng)調(diào)用是用戶程序或操作調(diào)用核心所提供的功能的接口;也是分析Linux內(nèi)核源碼幾個很好的入口點之一。對于那些在dos或Uinx、Linux下有過C編程經(jīng)驗的高手尤其如此。又由于系統(tǒng)調(diào)用相對其它功能而言,較為簡單,所以,我就以它為例,希望通過對系統(tǒng)調(diào)用的分析,

2、能使讀者體會到這一方法。  與系統(tǒng)調(diào)用相關的內(nèi)容主要有:系統(tǒng)調(diào)用總控程序,系統(tǒng)調(diào)用向量表sys_call_table,以及各系統(tǒng)調(diào)用服務程序。下面將對此一一介紹:保護模式下的初始化過程中,設置并初始化idt,共256個入口,服務程序均為ignore_int,該服務程序僅打印“Unknowninterruptn”。(源碼參見/Arch/i386/KERNEL/head.S文件;相關內(nèi)容可參見保護模式下的初始化部分)在系統(tǒng)初始化完成后運行的第一個內(nèi)核程序start_kernel中,通過調(diào)用trap_init函數(shù),把各自陷和中斷服務程序的入口地址設置到id

3、t表中;同時,此函數(shù)還通過調(diào)用函數(shù)set_system_gate把系統(tǒng)調(diào)用總控程序的入口地址掛在中斷0x80上。其中:start_kernel的原型為void__initstart_kernel(void),其源碼在文件init/main.c中;trap_init函數(shù)的原型為void__inittrap_init(void),定義在arch/i386/kernel/traps.c中函數(shù)set_system_gate同樣定義在arch/i386/kernel/traps.c中,調(diào)用原型為set_system_gate(SYSCALL_VECTOR,&s

4、ystem_call);其中,SYSCALL_VECTOR是定義在linux/arch/i386/kernel/irq.h中的一個常量0x80;而system_call即為系統(tǒng)調(diào)用總控程序的入口地址;中斷總控程序用匯編語言定義在arch/i386/kernel/entry.S中。(其它相關內(nèi)容可參見中斷和中斷處理部分)系統(tǒng)調(diào)用向量表sys_call_table,是一個含有NR_syscalls=256個單元的數(shù)組。它的每個單元存放著一個系統(tǒng)調(diào)用服務程序的入口地址。該數(shù)組定義在/arch/i386/kernel/entry.S中;而NR_syscall

5、s則是一個等于256的宏,定義在include/linux/sys.h中。各系統(tǒng)調(diào)用服務程序則分別定義在各個模塊的相應文件中;例如asmlinkageintsys_time(int*tloc)就定義在kerneltime.c中;另外,在kernelsys.c中也有不少服務程序;II、系統(tǒng)調(diào)用過程 ∥頤侵潰低車饔檬怯沒С絳蚧蠆僮韉饔煤誦乃峁┑墓δ艿慕涌?;所翼嵉蛙圁用的过硣@褪譴佑沒С絳虻較低襯諍?,染忬又回到記]С絳虻墓蹋輝贚inux中,此過程大體過程可描述如下:  系統(tǒng)調(diào)用過程示意圖:  整個系統(tǒng)調(diào)用進入過程客表示如下:用戶程序系統(tǒng)調(diào)用總控程序

6、(system_call)各個服務程序  可見,系統(tǒng)調(diào)用的進入課分為“用戶程序系統(tǒng)調(diào)用總控程序”和“系統(tǒng)調(diào)用總控程序各個服務程序”兩部分;下邊將分別對這兩個部分進行詳細說明:“用戶程序系統(tǒng)調(diào)用總控程序”的實現(xiàn):在前面已經(jīng)說過,Linux的系統(tǒng)調(diào)用使用第0x80號中斷向量項作為總的入口,也即,系統(tǒng)調(diào)用總控程序的入口地址system_call就掛在中斷0x80上。也就是說,只要用戶程序執(zhí)行0x80中斷(int0x80),就可實現(xiàn)“用戶程序系統(tǒng)調(diào)用總控程序”的進入;事實上,在Linux中,也是這么做的。只是0x80中斷的執(zhí)行語句int0x80被封裝在標準C

7、庫中,用戶程序只需用標準系統(tǒng)調(diào)用函數(shù)就可以了,而不需要在用戶程序中直接寫0x80中斷的執(zhí)行語句int0x80。至于中斷的進入的詳細過程可參見前面的“中斷和中斷處理”部分?!跋到y(tǒng)調(diào)用總控程序各個服務程序”的實現(xiàn):在系統(tǒng)調(diào)用總控程序中通過語句“call*SYMBOL_NAME(sys_call_table)(,%eax,4)”來調(diào)用各個服務程序(SYMBOL_NAME是定義在/include/linux/linkage.h中的宏:#defineSYMBOL_NAME_LABEL(X)X),可以忽略)。當系統(tǒng)調(diào)用總控程序執(zhí)行到此語句時,eax中的內(nèi)容即是相

8、應系統(tǒng)調(diào)用的編號,此編號即為相應服務程序在系統(tǒng)調(diào)用向量表sys_call_table中的編號(關于系統(tǒng)調(diào)用的

當前文檔最多預覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當前文檔最多預覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學公式或PPT動畫的文件,查看預覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負責整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細閱讀文檔內(nèi)容,確認文檔內(nèi)容符合您的需求后進行下載,若出現(xiàn)內(nèi)容與標題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。