linux內(nèi)核系統(tǒng)調(diào)用實(shí)驗(yàn)指導(dǎo)書(shū)_第1頁(yè)
linux內(nèi)核系統(tǒng)調(diào)用實(shí)驗(yàn)指導(dǎo)書(shū)_第2頁(yè)
linux內(nèi)核系統(tǒng)調(diào)用實(shí)驗(yàn)指導(dǎo)書(shū)_第3頁(yè)
linux內(nèi)核系統(tǒng)調(diào)用實(shí)驗(yàn)指導(dǎo)書(shū)_第4頁(yè)
linux內(nèi)核系統(tǒng)調(diào)用實(shí)驗(yàn)指導(dǎo)書(shū)_第5頁(yè)
已閱讀5頁(yè),還剩26頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

linux內(nèi)核系統(tǒng)調(diào)用實(shí)驗(yàn)指導(dǎo)書(shū)第一頁(yè),共31頁(yè)。基本知識(shí)2第二頁(yè),共31頁(yè)。…xyz()…system_call:…sys_xyz()…ret_from_sys_call:…iretxyz(){…int0x80…}sys_xyz(){…}用戶(hù)態(tài) 內(nèi)核態(tài)在應(yīng)用程序中使用系統(tǒng)調(diào)用glibc標(biāo)準(zhǔn)庫(kù)中的封裝例程(系統(tǒng)調(diào)用函數(shù)的具體實(shí)現(xiàn))系統(tǒng)調(diào)用處理程序系統(tǒng)調(diào)用服務(wù)例程(內(nèi)核函數(shù))系統(tǒng)調(diào)用處理過(guò)程3第三頁(yè),共31頁(yè)。為什么有系統(tǒng)調(diào)用?一般用戶(hù)進(jìn)程不能直接訪(fǎng)問(wèn)系統(tǒng)內(nèi)核,不能直接使用或修改內(nèi)核數(shù)據(jù),以免干擾內(nèi)核程序的執(zhí)行,妨礙系統(tǒng)安全。系統(tǒng)調(diào)用是什么?用戶(hù)進(jìn)程要使用內(nèi)核功能時(shí),只能通過(guò)內(nèi)核提供的接口——系統(tǒng)調(diào)用來(lái)實(shí)現(xiàn),系統(tǒng)調(diào)用實(shí)際是操作系統(tǒng)內(nèi)核提供的、功能較強(qiáng)的一系列函數(shù)。系統(tǒng)調(diào)用好比一個(gè)中間人,把用戶(hù)進(jìn)程的系統(tǒng)調(diào)用請(qǐng)求傳達(dá)給內(nèi)核,待內(nèi)核把請(qǐng)求處理完畢后再將處理結(jié)果送回給用戶(hù)空間。系統(tǒng)調(diào)用是用戶(hù)空間訪(fǎng)問(wèn)內(nèi)核的唯一手段。系統(tǒng)調(diào)用發(fā)生時(shí)會(huì)從用戶(hù)態(tài)轉(zhuǎn)到內(nèi)核態(tài),完成功能后又由內(nèi)核態(tài)轉(zhuǎn)回用戶(hù)態(tài)。4第四頁(yè),共31頁(yè)。使用系統(tǒng)調(diào)用的兩種方式1、通過(guò)C庫(kù)函數(shù)2、使用syscall函數(shù)

syscall函數(shù)原型為:

intsyscall(intnumber,…);通過(guò)指定系統(tǒng)調(diào)用號(hào)和一組函數(shù)來(lái)調(diào)用系統(tǒng)調(diào)用*2.6.19版前使用_syscall宏C庫(kù)函數(shù)內(nèi)核系統(tǒng)調(diào)用應(yīng)用程序代碼5第五頁(yè),共31頁(yè)。C庫(kù)函數(shù)系統(tǒng)調(diào)用例子用戶(hù)程序中使用C庫(kù)中的函數(shù)malloc函數(shù)free函數(shù)srccpy函數(shù)open函數(shù)brk系統(tǒng)調(diào)用open系統(tǒng)調(diào)用6第六頁(yè),共31頁(yè)。系統(tǒng)如何響應(yīng)調(diào)用的?

系統(tǒng)調(diào)用函數(shù)中的int$0x80匯編指令,會(huì)產(chǎn)生向量為128的異常。內(nèi)核通過(guò)查中斷向量表找到128號(hào)異常對(duì)應(yīng)的處理程序——系統(tǒng)調(diào)用處理程system_call()如何找到對(duì)應(yīng)的內(nèi)核函數(shù)?

system_call()利用系統(tǒng)調(diào)用號(hào)查系統(tǒng)調(diào)用表sys_call_table,找到對(duì)應(yīng)每個(gè)系統(tǒng)調(diào)用號(hào)的處理函數(shù)。7第七頁(yè),共31頁(yè)。實(shí)驗(yàn)8第八頁(yè),共31頁(yè)。一、實(shí)驗(yàn)?zāi)康膶W(xué)習(xí)如何產(chǎn)生一個(gè)系統(tǒng)調(diào)用往內(nèi)核中添加一個(gè)新的函數(shù)實(shí)現(xiàn)對(duì)用戶(hù)空間的讀寫(xiě)理解、掌握Linux系統(tǒng)調(diào)用的實(shí)現(xiàn)框架、用戶(hù)界面、參數(shù)傳遞、進(jìn)入/返回過(guò)程。9第九頁(yè),共31頁(yè)。二、主要實(shí)驗(yàn)環(huán)境Linux環(huán)境:CentOS6.0,linuxkernel2.6.32.71欲編譯內(nèi)核:linux-2.6.35.13命令uname–r10第十頁(yè),共31頁(yè)。三、實(shí)驗(yàn)指導(dǎo)獲得內(nèi)核源代碼,本次下載的內(nèi)核版本為2.6.35.13將內(nèi)核源碼保存到/usr/src目錄下cd/usr/srctar–xjvflinux-2.6.35.13.tar.bz2tarzxvflinux-2.6.35.13.tar.gz定義系統(tǒng)調(diào)用編號(hào)和修改系統(tǒng)調(diào)用表11第十一頁(yè),共31頁(yè)。1)系統(tǒng)調(diào)用表

系統(tǒng)調(diào)用表sys_call_table存儲(chǔ)了所有系統(tǒng)調(diào)用對(duì)應(yīng)的服務(wù)例程的函數(shù)地址。對(duì)于X8632位體系結(jié)構(gòu)的系統(tǒng)調(diào)用表位于arch/X86/kernel/syscall_table_32.S文件中定義。系統(tǒng)調(diào)用服務(wù)例程的名字均遵守一定的規(guī)則:系統(tǒng)調(diào)用名稱(chēng)前增加“sys_”前綴,比如open系統(tǒng)調(diào)用對(duì)應(yīng)sys_open函數(shù)。可以使用man2syscalls瀏覽所有系統(tǒng)調(diào)用的添加歷史12第十二頁(yè),共31頁(yè)。系統(tǒng)調(diào)用表位置cd/usr/src/linux-2.6.35.13/arch/x86/kernelvisyscall_table_32.S第n個(gè)表項(xiàng)對(duì)應(yīng)了系統(tǒng)調(diào)用號(hào)為n的服務(wù)例程的入口地址的指針修改系統(tǒng)調(diào)用表:將.longsys_my_new_call添加到arch/x86/kernel/syscall_table_32.S中最后一行13第十三頁(yè),共31頁(yè)。2)系統(tǒng)調(diào)用號(hào)

/arch/x86/include/asm/unistd_32.h

每個(gè)系統(tǒng)調(diào)用號(hào)都是唯一的,依次對(duì)應(yīng)sys_call_table中的一項(xiàng),系統(tǒng)調(diào)用號(hào)寫(xiě)在unistd.h文件中,以“__NR_”開(kāi)頭。

內(nèi)核通過(guò)系統(tǒng)調(diào)用號(hào)作為下標(biāo)去獲取sys_call_table中的服務(wù)例程函數(shù)地址。

系統(tǒng)調(diào)用號(hào)一旦分配就不能再有任何變更,系統(tǒng)運(yùn)行中即使該系統(tǒng)調(diào)用被刪除,它所擁有的系統(tǒng)調(diào)用號(hào)也不能被回收利用。14第十四頁(yè),共31頁(yè)。對(duì)于32位x86架構(gòu)系統(tǒng)調(diào)用號(hào)位于arch/x86/include/asm/unistd_32.h15第十五頁(yè),共31頁(yè)。4.編譯內(nèi)核的方法makemrpropermakecleanmakeoldconfigmakeallmakemodules_installmakeinstall命令“makeall”用于生成期望的內(nèi)核映像及模塊;“makemodules_install”將安裝模塊到“默認(rèn)目錄/lib/module/<內(nèi)核版本號(hào)>”下面;“makeinstall”最終將內(nèi)核映像等幾個(gè)文件復(fù)制到“/boot”目錄,并修改引導(dǎo)程序的配置以啟用該新內(nèi)核。16第十六頁(yè),共31頁(yè)。以上命令執(zhí)行完畢后,會(huì)在當(dāng)前目錄下生成一個(gè)名為System.map的文件,會(huì)在/usr/src/linux-版本號(hào)/arch/i386/boot/下生成一個(gè)bzImage文件和vmlinuz文件。cd/boot(進(jìn)入/boot目錄)17第十七頁(yè),共31頁(yè)。5.修改引導(dǎo)程序GRUBcd/boot/grubvimenu.lst

為了以后能直接操作菜單,可把menu.lst文件中hiddenmenu那一行注釋掉(前加#)或刪除,并且可以根據(jù)需要設(shè)置其中的default和timeout的值,分別表示默認(rèn)啟動(dòng)項(xiàng)及等待時(shí)間。18第十八頁(yè),共31頁(yè)。#hiddenmenudefault=0timeout=15splashimage=(hd0,0)/grub/splash.xpm.gztitlecentos(2.6.35.13)

root(hd0,0)

kernel/vmlinuz-2.6.35.13roroot=/dev/mapper/vg_wufeifei-lv_root

initrd/initramfs-2.6.35.13.imgtitlecentos(2.6.32-71.el6.i686)

root(hd0,0)

kernel/vmlinuz-2.6.32-71.el6.i686roroot=/dev/mapper/vg_wufeifei-lv_root19第十九頁(yè),共31頁(yè)。reboot重啟系統(tǒng)就可以看到GRUB菜單已經(jīng)包含了新編譯的內(nèi)核選擇新編譯的內(nèi)核啟動(dòng)系統(tǒng)。可用uname–r測(cè)試當(dāng)前內(nèi)核版本號(hào)。任務(wù)完成后也可修改/boot/grub/menu.1st文件中移去不需要的引導(dǎo)內(nèi)核信息20第二十頁(yè),共31頁(yè)。測(cè)試小例子:在現(xiàn)有的系統(tǒng)中添加一個(gè)傳遞數(shù)值參數(shù)的系統(tǒng)調(diào)用。這個(gè)系統(tǒng)調(diào)用的功能打印傳入內(nèi)核的參數(shù)。主要內(nèi)容:在系統(tǒng)調(diào)用表中添加相應(yīng)表項(xiàng)添加系統(tǒng)調(diào)用號(hào)sys_my_sys_call的實(shí)現(xiàn)編寫(xiě)用戶(hù)態(tài)測(cè)試程序21第二十一頁(yè),共31頁(yè)。在系統(tǒng)調(diào)用表中添加或修改相應(yīng)表項(xiàng)

在2.6.35.13的內(nèi)核下,只需要修改arch/x86/kernel/syscall_table_32.S.longsys_rt_tgsigqueueinfo/*335*/.longsys_perf_event_open.longsys_recvmmsg.longsys_my_new_call/*338*/.longsys_pedagogictime/*339*/22第二十二頁(yè),共31頁(yè)。添加系統(tǒng)調(diào)用號(hào)

系統(tǒng)調(diào)用號(hào)在文件unistd_32.h里面定義這個(gè)文件在kernel2.6.35.13位于/arch/x86/include/asm/unistd_32.h。現(xiàn)在我們?cè)趗nistd.h中添加我們的系統(tǒng)調(diào)用號(hào):__NR_my_new_call,如下所示:#define__NR_rt_tgsigqueueinfo 335#define__NR_perf_event_open 336#define__NR_recvmmsg 337#define__NR_my_new_call338#define__NR_pedagogictime33923第二十三頁(yè),共31頁(yè)。sys_my_new_call函數(shù)實(shí)現(xiàn)cd/usr/src/linux-2.6.35.13/kernel添加一個(gè)打印輸入值的系統(tǒng)調(diào)用visys.c上面在系統(tǒng)調(diào)用表中指明了系統(tǒng)調(diào)用號(hào)_NR_my_new_call對(duì)應(yīng)的系統(tǒng)調(diào)用服務(wù)例程是sys_my_new_call24第二十四頁(yè),共31頁(yè)。重新編譯內(nèi)核。成功后,重啟。此時(shí),在啟動(dòng)項(xiàng)中有2.6.32和2.6.35兩個(gè)選項(xiàng),其中新的內(nèi)核是2.6.35。選擇它并進(jìn)入系統(tǒng)。至此,我們已經(jīng)成功添加了一個(gè)自己的系統(tǒng)調(diào)用。編譯成功之后編寫(xiě)用戶(hù)空間程序進(jìn)行測(cè)試testcall.c

#include<linux/unistd.h>intmain(){syscall(338,50);/*338是新添加的系統(tǒng)調(diào)用號(hào),50是參數(shù)*/return0;}終端編譯

gcca–otestcall運(yùn)行

./a查看結(jié)果:終端運(yùn)行命令dmesg會(huì)看到在最后一行輸出

callnumberis5025第二十五頁(yè),共31頁(yè)。問(wèn)題A設(shè)計(jì)并實(shí)現(xiàn)一個(gè)新的內(nèi)核函數(shù)pedagogictime(),該函數(shù)通過(guò)使用一個(gè)引用參數(shù)的調(diào)用返回當(dāng)前的系統(tǒng)時(shí)間。如果flag的參數(shù)為T(mén)RUE,內(nèi)核就把當(dāng)前的系統(tǒng)時(shí)間打印輸出 intpedagogictime(intflag,structtimeval*tv) 新函數(shù)基本和gettimeofday()類(lèi)似 cd/usr/src/linux2.6.35.13/kernel vitime.c添加實(shí)現(xiàn)代碼26第二十六頁(yè),共31頁(yè)。#include<linux/time.h>#include<linux/kernel.h>#include<linux/mm.h>asmlinkageintsys_pedagogictime(intflag,structtimeval*tv){ if(tv){ structtimevalktv; do_gettimeofday(&ktv); if(copy_to_user(tv,&ktv,sizeof(ktv)))return-EFAULT;

} if(flag==true) printk("tv.sec:%ld\n",(*tv).tv_sec); return0;}27第二十七頁(yè),共31頁(yè)。問(wèn)題B編寫(xiě)用戶(hù)空間程序來(lái)測(cè)試pedagogictime()的執(zhí)行情況#include<linux/time.h>#include<linux/unistd.h>intmain(){structtimevaltv;tv.tv_sec=10;syscall(339,1,&tv);printf(“userfirstgettv_sec\n”,tv.tv_sec);printf(“nowsleep10seconds\n”);sleep(10);printf(“userfirstgettv_sec\n”,tv.tv_sec);return0;}28第二十八頁(yè),共31頁(yè)。shell下用dmesg命令觀察內(nèi)存打印信息最下面兩行即為內(nèi)核函數(shù)輸出29第二十九頁(yè),共31頁(yè)。心得、體會(huì)全部編譯一次內(nèi)核會(huì)很長(zhǎng),大約3個(gè)小時(shí)。編過(guò)一次內(nèi)核后,由于

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論