網(wǎng)絡(luò)工程專(zhuān)業(yè)畢業(yè)論文—添加一個(gè)系統(tǒng)調(diào)用課程設(shè)計(jì)43394_第1頁(yè)
網(wǎng)絡(luò)工程專(zhuān)業(yè)畢業(yè)論文—添加一個(gè)系統(tǒng)調(diào)用課程設(shè)計(jì)43394_第2頁(yè)
網(wǎng)絡(luò)工程專(zhuān)業(yè)畢業(yè)論文—添加一個(gè)系統(tǒng)調(diào)用課程設(shè)計(jì)43394_第3頁(yè)
網(wǎng)絡(luò)工程專(zhuān)業(yè)畢業(yè)論文—添加一個(gè)系統(tǒng)調(diào)用課程設(shè)計(jì)43394_第4頁(yè)
網(wǎng)絡(luò)工程專(zhuān)業(yè)畢業(yè)論文—添加一個(gè)系統(tǒng)調(diào)用課程設(shè)計(jì)43394_第5頁(yè)
已閱讀5頁(yè),還剩13頁(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)介

1、添加一個(gè)系統(tǒng)調(diào)用設(shè)計(jì)說(shuō)明書(shū)學(xué)院名稱(chēng): 計(jì)算機(jī)與信息工程學(xué)院 班級(jí)名稱(chēng): 網(wǎng)工111班 學(xué)生姓名: 學(xué) 號(hào): 題 目: 添加一個(gè)系統(tǒng)調(diào)用 指導(dǎo)教師姓 名: 起止日期: 2013-6-32013-6-30 第一部分:正文部分一、選題背景本設(shè)計(jì)是專(zhuān)業(yè)基礎(chǔ)課計(jì)算機(jī)操作系統(tǒng)的課程設(shè)計(jì)。由于操作系統(tǒng)課的學(xué)時(shí)有限,沒(méi)有安排實(shí)驗(yàn)。為了理論聯(lián)系實(shí)際,加強(qiáng)分析問(wèn)題、解決問(wèn)題能力的培養(yǎng),加深理解和更好地掌握操作系統(tǒng)的基本概念、原理、技術(shù)和方法。特安排操作系統(tǒng)課程設(shè)計(jì)。它是操作系統(tǒng)課程的實(shí)踐環(huán)節(jié)。由于具體的操作系統(tǒng)相當(dāng)復(fù)雜,在短短的一周之內(nèi),不可能對(duì)所有管理系統(tǒng)進(jìn)行詳細(xì)地分析。因此,選擇了操作系統(tǒng)中的對(duì)linux系統(tǒng)

2、添加一個(gè)新的函數(shù),作為本設(shè)計(jì)的任務(wù),使學(xué)生在使用系統(tǒng)調(diào)用的同時(shí),進(jìn)一步了解系統(tǒng)內(nèi)部是如何實(shí)現(xiàn)系統(tǒng)調(diào)用的全過(guò)程,使學(xué)生在更深層次上對(duì)操作系統(tǒng)有所了解。二、設(shè)計(jì)思路2.1課程設(shè)計(jì)題目添加一個(gè)系統(tǒng)調(diào)用2.2 課程設(shè)計(jì)任務(wù)根據(jù)red hat 9平臺(tái)下系統(tǒng)調(diào)用的調(diào)用方式,在系統(tǒng)中添加一個(gè)功能為打印一句話“hello,system call”的系統(tǒng)調(diào)用。按照要求撰寫(xiě)課程設(shè)計(jì)報(bào)告。2.3 課程設(shè)計(jì)思想操作系統(tǒng)的主要功能是為應(yīng)用程序的運(yùn)行創(chuàng)建良好的環(huán)境,為了達(dá)到這個(gè)目的,內(nèi)核提供一系列具備預(yù)定功能的多內(nèi)核函數(shù),通過(guò)一組稱(chēng)為系統(tǒng)調(diào)用(system call)的接口呈現(xiàn)給用戶(hù)。系統(tǒng)調(diào)用把應(yīng)用程序的請(qǐng)求傳給內(nèi)核,調(diào)

3、用相應(yīng)的的內(nèi)核函數(shù)完成所需的處理,將處理結(jié)果返回給應(yīng)用程序,如果沒(méi)有系統(tǒng)調(diào)用和內(nèi)核函數(shù),用戶(hù)將不能編寫(xiě)大型應(yīng)用程序。linux系統(tǒng)調(diào)用,包含了大部分常用系統(tǒng)調(diào)用和由系統(tǒng)調(diào)用派生出的的函數(shù)。2.4 軟硬件運(yùn)行環(huán)境計(jì)算機(jī)一臺(tái)、windows xp系統(tǒng)、vmware workstaion 軟件、red hat 9軟件2.5 開(kāi)發(fā)工具linux、gcc編譯器、vi編輯器三、過(guò)程論述3.1 流程圖圖3.1 添加系統(tǒng)調(diào)用流程圖3.2 實(shí)驗(yàn)方法每個(gè)系統(tǒng)調(diào)用都是通過(guò)一個(gè)單一的入口點(diǎn)多路傳入內(nèi)核。eax 寄存器用來(lái)標(biāo)識(shí)應(yīng)當(dāng)調(diào)用的某個(gè)系統(tǒng)調(diào)用,這在 c 庫(kù)中做了指定(來(lái)自用戶(hù)空間應(yīng)用程序的每個(gè)調(diào)用)。當(dāng)加載了系統(tǒng)

4、的 c 庫(kù)調(diào)用索引和參數(shù)時(shí),就會(huì)調(diào)用一個(gè)軟件中斷(0x80 中斷),它將執(zhí)行 system_call 函數(shù)(通過(guò)中斷處理程序),這個(gè)函數(shù)會(huì)按照 eax 內(nèi)容中的標(biāo)識(shí)處理所有的系統(tǒng)調(diào)用。在經(jīng)過(guò)幾個(gè)簡(jiǎn)單測(cè)試之后,使用 system_call_table 和 eax 中包含的索引來(lái)執(zhí)行真正的系統(tǒng)調(diào)用了。從系統(tǒng)調(diào)用中返回后,最終執(zhí)行 syscall_exit,并調(diào)用 resume_userspace 返回用戶(hù)空間。然后繼續(xù)在 c 庫(kù)中執(zhí)行,它將返回到用戶(hù)應(yīng)用程序中。3.3 實(shí)驗(yàn)原理圖3.2 使用中斷方法的系統(tǒng)調(diào)用的簡(jiǎn)化流程圖圖3.3 系統(tǒng)調(diào)用表和各種鏈接3.4 程序結(jié)構(gòu)框圖圖3.4 程序結(jié)構(gòu)框圖3.5

5、操作步驟第一步:編譯前準(zhǔn)備下載一份內(nèi)核源代碼,例如linux-2.4.tar.gz檢查redhat中是否已有模塊工具軟件module-init-tools:# rpm qmodutils安裝:# rpm ivh modutils-2.4.21-23.src.rpm將linux-2.4.tar.gz拷貝到目錄/usr/src/下,解壓源碼:# tar zxvf linux-2.4.tar.gz生成源碼文件子目錄/usr/src/linux-2.4,進(jìn)入此目錄:# cd linux-2.4.第二步:編譯新內(nèi)核配置內(nèi)核,有三種方式配置內(nèi)核:# make config命令行界面# make menuc

6、onfig 字符菜單界面# make xconfig 圖形界面雖然選擇圖形界面比較方便,但配置過(guò)程很繁瑣,可將現(xiàn)有的配置文件拷貝過(guò)來(lái)使用(/usr/src/linux-2.4/.config)。編譯生成新內(nèi)核:# cd /usr/src/linux-2.4# make dep創(chuàng)建代碼依賴(lài)文件(.depend),每次重新配置后都必須做這一步。# make bzimage開(kāi)始編譯系統(tǒng)內(nèi)核(不包括帶m選項(xiàng)的模塊),生成的壓縮文件bzimage在./arch/i386/boot/下。同時(shí)生成未壓縮的內(nèi)核執(zhí)行文件(vmlinux)和內(nèi)核符號(hào)表(system.map)。# make modules 開(kāi)始編

7、譯外掛模塊。以后重新編譯內(nèi)核時(shí),可省去這一步。# make modules_install將外掛模塊放在系統(tǒng)模塊安裝目錄(/lib/modules/2.4/)下,以便核心在需要時(shí)加載它們。同時(shí)在此目錄下產(chǎn)生模塊依賴(lài)文件(modules.dep)。# make install將bzimage和system.map拷貝到/boot/下,并建立相應(yīng)的符號(hào)鏈接(vmlinuz和system.map);生成/dev/initrd映象文件(initrd-2.4.img);在/etc/下的啟動(dòng)配置文件lilo.conf或grub.conf中添加相應(yīng)項(xiàng)。第三步:運(yùn)行新內(nèi)核# reboot,選擇啟動(dòng)新內(nèi)核:需要

8、注意的是,如果編譯的內(nèi)核版本號(hào)(在makefile中定義)與正在運(yùn)行的內(nèi)核一樣,就會(huì)覆蓋現(xiàn)有內(nèi)核的文件。為了防止新內(nèi)核影響原內(nèi)核,讓新內(nèi)核有一個(gè)不同的版本號(hào)。最好將編譯內(nèi)核前的虛擬機(jī)備份,以便在發(fā)生新內(nèi)核導(dǎo)致系統(tǒng)無(wú)法正常運(yùn)行時(shí)使用備份的系統(tǒng)。第四步:?jiǎn)?dòng)新內(nèi)核后啟動(dòng)新內(nèi)核后需要重新運(yùn)行vmware tools的配置程序/usr/bin/vmware-config-tools.pl,以使網(wǎng)絡(luò)界面正常和共享windows主機(jī)的文件夾。四、結(jié)果分析4.1添加新函數(shù)先用uname a命令獲取當(dāng)前l(fā)inux內(nèi)核版本。在/usr/src/linux-2.4/kernel/sys.c中,添加一個(gè)系統(tǒng)調(diào)用函數(shù)

9、內(nèi)核,命令如圖4.1所示。圖4.1 初始界面 4.2 更新頭文件在/usr/src/linux-2.4/include/asm-i386更新頭文件,如圖4.3所示。圖4.3 命令界面圖4.4 更新操作4.3針對(duì)這個(gè)新函數(shù)更新系統(tǒng)調(diào)用表在/usr/src/linux-2.4/arch/i386/kernel/entry.s中,添加一個(gè)系統(tǒng)調(diào)用,如圖4.5所示。圖4.5 命令界面圖4.6 更新系統(tǒng)調(diào)用表4.4 重新編譯內(nèi)核將/usr/src/linux-2.4/makefile中的版本號(hào)里的customer去掉,防止內(nèi)核版本沖突。如圖4.8所示。圖4.7 命令界面編譯內(nèi)核 make mrprope

10、r; /*文件歸位。清除上次編譯內(nèi)核的文件*/make xconfig;必選的配置選項(xiàng)如下:scsi device support-scsi low-level drivers- buslogic scsi support。如圖4.9所示。圖4.9 scsi support界面fusion mpt device support- fusion mpt (base + scsihost) drivers和fusion mpt misc device (ioctl) driver。如圖4.10所示。圖4.10 fusion mpt device support界面network devices s

11、upport-ethernet (10 or 100mbit)- amd pcnet32 pci support。如圖4.11所示。圖4.11 network device support界面block devices-ram disk support 和initial disk(initrd) support。如圖4.12所示。圖4.12 block device界面file systems-ext3 journalling system support。如圖4.13所示。圖 4.13 file systems 界面執(zhí)行以下語(yǔ)句make dep; /作用:配置內(nèi)核代碼前需要進(jìn)行配置;根據(jù)用戶(hù)

12、的配置設(shè)置源代碼的相關(guān)性make bzimage;/內(nèi)核編譯,生成一個(gè)新內(nèi)核映像文件bzimage,即編譯好的可以被cpu直接執(zhí)行的二進(jìn)制機(jī)器碼。make modules;make modules_install;/配置的內(nèi)核有模塊支持make install;/將內(nèi)核安裝在系統(tǒng)中這之后新內(nèi)核已經(jīng)安裝在了系統(tǒng)中,我們只需重啟一下系統(tǒng)。五、結(jié)論在重新啟動(dòng)并成功進(jìn)入系統(tǒng)之后,我們需要對(duì)之前增加的系統(tǒng)調(diào)用進(jìn)行測(cè)試,測(cè)試代碼如圖 5.1所示。待添加的隱藏文字內(nèi)容3圖5.1 測(cè)試代碼部分擊保存并退出gedit界面對(duì)c語(yǔ)言程序進(jìn)行編譯,最終得到文件名為test的可執(zhí)行文件,在終端中輸入。如圖5.2所示。圖

13、5.2 命令代碼通過(guò)觀察實(shí)驗(yàn)結(jié)果可得知,新添加的系統(tǒng)函數(shù)調(diào)用成功。第二部分:參考文獻(xiàn)1 湯小丹,等.計(jì)算機(jī)操作系統(tǒng).第三版.西安:西安電子科技大學(xué)出版社,20072 張堯?qū)W,史美林.計(jì)算機(jī)操作系統(tǒng)教程.北京:清華大學(xué)出版社,20003 尤晉元. unix操作系統(tǒng)教程.西安:西安電子科技大學(xué)出版社,1995 學(xué)生簽名: 填表日期: 年 月 日第三部分:指導(dǎo)教師評(píng)語(yǔ)第四部分:成績(jī)?cè)u(píng)定指導(dǎo)教師簽名: 填表日期: 年 月 日附錄解釋調(diào)用系統(tǒng)調(diào)用的過(guò)程:測(cè)試程序test.c中的_syscall1是定義在include/asm-i386/unistd.h中的宏:#define _syscall1(type

14、,name,type1,arg1) type name(type1 arg1) long _res; _asm_ volatile (int $0x80 : =a (_res) : 0 (_nr_#name),b (long)(arg1); _syscall_return(type,_res); 其中_syscall_return也定義在該文件中#define _syscall_return(type, res) do if (unsigned long)(res) = (unsigned long)(-125) errno = -(res); res = -1; return (type)

15、(res); while (0)所以test.c中_syscall1(int,addtotal,int,num)展開(kāi)后即:int addtotal(int num)long _res;_asm_ volatile(“int $0x80”:”=a”(_res):”0”(_nr_addtotal),”b”(long)(num);do if (unsigned long)(_res) = (unsigned long)(-125) errno = -(_res); _res = -1; return (int) (_res); while (0)通過(guò)軟中斷int $0x80,其中系統(tǒng)調(diào)用號(hào)為eax中

16、的_nr_#name,這里也就是_nr_addtotal,在上面的步驟3中有#define _nr_addtotal 259,即259號(hào)系統(tǒng)調(diào)用。寄存器ebx中存第一個(gè)參數(shù)num。idt中第0x80個(gè)門(mén)(其類(lèi)型為15,即陷阱門(mén))為系統(tǒng)啟動(dòng)(init/main.c中start_kernel調(diào)用i386/kernel/traps.c中trap_init)時(shí)設(shè)置的,trap_init中set_system_gate(0x80,&system_call);故int $0x80指令通過(guò)該系統(tǒng)門(mén)后轉(zhuǎn)到內(nèi)核的system_call處執(zhí)行。system_call定義在arch/i386/kernel/entr

17、y.s中:entry(system_call)/轉(zhuǎn)到此處執(zhí)行 pushl %eax # save orig_eax save_all/把寄存器壓入堆棧 get_current(%ebx) testb $0x02,tsk_ptrace(%ebx) # pt_tracesys jne tracesys cmpl $(nr_syscalls),%eax jae badsys call *symbol_name(sys_call_table)(,%eax,4) /此時(shí)eax=系統(tǒng)調(diào)用號(hào)=_nr_addtotal=259 movl %eax,eax(%esp) # save the return val

18、ueentry(ret_from_sys_call)/從系統(tǒng)調(diào)用返回 cli # need_resched and signals atomic test cmpl $0,need_resched(%ebx) jne reschedule /如果需要重新調(diào)度則跳去調(diào)度 cmpl $0,sigpending(%ebx) jne signal_returnrestore_all: restore_allsys_call_table即第一部分2中修改的部分,可以看成一個(gè)函數(shù)指針數(shù)組,按下標(biāo)指向?qū)?yīng)系統(tǒng)調(diào)用的函數(shù)地址,此處即call *symbol_name(sys_call_table)(,%eax,4)調(diào)用我們asmlinkage int sys_addtotal(int numdata)。上面的save_all是定義在arch/i386/kernel/entry.s中的宏:#define save_all cld; pushl %es; pushl %ds; pushl %eax; pushl

溫馨提示

  • 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)論