日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Linux 內(nèi)核解讀入門( 二 )


程中,你就會被一點(diǎn)一點(diǎn)地、潛移默化地專業(yè)化;甚至,只要分析十分之一的代碼后,你就會深刻地體會到,什么樣
的代碼才是一個專業(yè)的程序員寫的,什么樣的代碼是一個業(yè)余愛好者寫的 。
為了使讀者能更好的體會到這一特點(diǎn),下面舉了一個具體的內(nèi)核分析實(shí)例,希望能通過這個實(shí)例,使讀者對 Linux
的內(nèi)核的組織有些具體的認(rèn)識,從中讀者也可以學(xué)到一些對內(nèi)核的分析方法 。

以下即為分析實(shí)例:

【一】操作平臺:
硬件:cpuintel Pentium II ;
軟件:Redhat Linux 6.0;內(nèi)核版本2.2.5

【二】相關(guān)內(nèi)核源代碼分析:
1.系統(tǒng)的引導(dǎo)和初始化:Linux 系統(tǒng)的引導(dǎo)有好幾種方式:常見的有 Lilo, Loadin引導(dǎo)和Linux的自舉引導(dǎo)
(bootsect-loader),而后者所對應(yīng)源程序?yàn)閍rch/i386/boot/bootsect.S,它為實(shí)模式的匯編程序,限于
 篇幅在此不做分析;無論是哪種引導(dǎo)方式,最后都要跳轉(zhuǎn)到arch/i386/Kernel/setup.S,setup.S主要是
 進(jìn)行時(shí)模式下的初始化,為系統(tǒng)進(jìn)入保護(hù)模式做準(zhǔn)備;此后,系統(tǒng)執(zhí)行 arch/i386/kernel/head.S (對經(jīng)壓縮
 后存放的內(nèi)核要先執(zhí)行 arch/i386/boot/compressed/head.S); head.S 中定義的一段匯編程序setup_idt ,
 它負(fù)責(zé)建立一張256項(xiàng)的 idt 表(Interrupt Descriptor Table),此表保存著所有自陷和中斷的入口地址;其中
 包括系統(tǒng)調(diào)用總控程序 system_call 的入口地址;當(dāng)然,除此之外,head.S還要做一些其他的初始化工作;
2.系統(tǒng)初始化后運(yùn)行的第一個內(nèi)核程序asmlinkage void __init start_kernel(void) 定義在
 /usr/src/linux/init/main.c中,它通過調(diào)用usr/src/linux/arch/i386/kernel/traps.c中的一個函數(shù)
 void __init trap_init(void) 把各自陷和中斷服務(wù)程序的入口地址設(shè)置到 idt 表中,其中系統(tǒng)調(diào)用總控程序
system_cal就是中斷服務(wù)程序之一;void __init trap_init(void) 函數(shù)則通過調(diào)用一個宏
set_system_gate(SYSCALL_VECTOR,&system_call); 把系統(tǒng)調(diào)用總控程序的入口掛在中斷0x80上;
其中SYSCALL_VECTOR是定義在 /usr/src/linux/arch/i386/kernel/irq.h中的一個常量0x80;而 system_call
 即為中斷總控程序的入口地址;中斷總控程序用匯編語言定義在/usr/src/linux/arch/i386/kernel/entry.S中;
3.中斷總控程序主要負(fù)責(zé)保存處理機(jī)執(zhí)行系統(tǒng)調(diào)用前的狀態(tài),檢驗(yàn)當(dāng)前調(diào)用是否合法, 并根據(jù)系統(tǒng)調(diào)用向量,使處理機(jī)
跳轉(zhuǎn)到保存在 sys_call_table 表中的相應(yīng)系統(tǒng)服務(wù)例程的入口; 從系統(tǒng)服務(wù)例程返回后恢復(fù)處理機(jī)狀態(tài)退回用戶程序;
而系統(tǒng)調(diào)用向量則定義在/usr/src/linux/include/asm-386/unistd.h中;sys_call_table 表定義在
/usr/src/linux/arch/i386/kernel/entry.S 中;同時(shí)在 /usr/src/linux/include/asm-386/unistd.h
中也定義了系統(tǒng)調(diào)用的用戶編程接口;
4.由此可見 ,linux 的系統(tǒng)調(diào)用也象 dos 系統(tǒng)的int 21h 中斷服務(wù),它把0x80 中斷作為總的入口, 然后
轉(zhuǎn)到保存在 sys_call_table 表中的各種中斷服務(wù)例程的入口地址 , 形成各種不同的中斷服務(wù);
由以上源代碼分析可知,要增加一個系統(tǒng)調(diào)用就必須在 sys_call_table表中增加一項(xiàng) ,并在其中保存好自己
的系統(tǒng)服務(wù)例程的入口地址,然后重新編譯內(nèi)核,當(dāng)然,系統(tǒng)服務(wù)例程是必不可少的 。
由此可知在此版linux內(nèi)核源程序<2 。2 。5>中,與系統(tǒng)調(diào)用相關(guān)的源程序文件就包括以下這些:
1.a(chǎn)rch/i386/boot/bootsect.S
2.a(chǎn)rch/i386/Kernel/setup.S
3.a(chǎn)rch/i386/boot/compressed/head.S
4.a(chǎn)rch/i386/kernel/head.S
5.init/main.c
6.a(chǎn)rch/i386/kernel/traps.c
7.a(chǎn)rch/i386/kernel/entry.S
8.a(chǎn)rch/i386/kernel/irq.h
9.include/asm-386/unistd.h

 當(dāng)然,這只是涉及到的幾個主要文件 。而事實(shí)上,增加系統(tǒng)調(diào)用真正要修改文件只有include/asm-386/unistd.h

推薦閱讀