nachos-Lab6實(shí)習(xí)報(bào)告_第1頁
nachos-Lab6實(shí)習(xí)報(bào)告_第2頁
nachos-Lab6實(shí)習(xí)報(bào)告_第3頁
nachos-Lab6實(shí)習(xí)報(bào)告_第4頁
nachos-Lab6實(shí)習(xí)報(bào)告_第5頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、系統(tǒng)調(diào)用實(shí)習(xí)報(bào)告目錄內(nèi)容一:總體概述3內(nèi)容二:任務(wù)完成情況3任務(wù)完成列表(Y/N)3具體Exercise的完成情況3內(nèi)容三:遇到的困難以及解決方法16內(nèi)容四:收獲及感想16內(nèi)容五:對(duì)課程的意見和建議16內(nèi)容六:參考文獻(xiàn)16內(nèi)容一:總體概述 本次lab的主要內(nèi)容是實(shí)現(xiàn)nachos定義的系統(tǒng)調(diào)用。理論方面,我們需要了解nachos系統(tǒng)調(diào)用的實(shí)現(xiàn)原理,實(shí)踐方面,我們需要實(shí)現(xiàn)文進(jìn)系統(tǒng)相關(guān)系統(tǒng)調(diào)用和用戶程序相關(guān)系統(tǒng)調(diào)用,并且編寫用戶程序驗(yàn)證相關(guān)系統(tǒng)調(diào)用的正確性。內(nèi)容二:任務(wù)完成情況任務(wù)完成列表(Y/N)Exercise1Exercise2Exercise3Exercise4Exercise5YYYYY具

2、體Exercise的完成情況一、理解Nachos系統(tǒng)調(diào)用Exercise 1 源代碼閱讀 閱讀與系統(tǒng)調(diào)用相關(guān)的源代碼,理解系統(tǒng)調(diào)用的實(shí)現(xiàn)原理。 code/userprog/syscall.h code/userprog/exception.cccode/test/start.suserprog/syscall.h定義nachos的系統(tǒng)調(diào)用,主要包括系統(tǒng)調(diào)用號(hào)和系統(tǒng)調(diào)用函數(shù),內(nèi)核通過識(shí)別用戶程序傳遞的系統(tǒng)調(diào)用號(hào)確定系統(tǒng)調(diào)用類型已經(jīng)實(shí)現(xiàn)的系統(tǒng)調(diào)用包括void Halt(); 關(guān)閉nachos虛擬機(jī),打印性能統(tǒng)計(jì)信息需要實(shí)現(xiàn)的系統(tǒng)調(diào)用包括:3種系統(tǒng)調(diào)用涉及地址空間:1)、void Exit(int

3、status);用戶程序完成,status = 0表示正常退出2)、SpaceId Exec(char *name);加載并執(zhí)行名字是name的Nachos可執(zhí)行文件,返回其地址空間的標(biāo)志符SpaceId實(shí)際是整型,標(biāo)識(shí)地址空間3)、int Join(SpaceId id); 等待標(biāo)志符為id的用戶線程運(yùn)行完畢,返回其退出狀態(tài)5種系統(tǒng)調(diào)用涉及文件系統(tǒng):1)、void Create(char *name);創(chuàng)建文件名name的Nachos文件2) 、OpenFileId Open(char *name);打開文件名name的Nachos文件,返回打開文件標(biāo)志符OpenFileId實(shí)際是整形,標(biāo)識(shí)

4、打開文件3)、void Write(char *buffer, int size, OpenFileId id);向標(biāo)志符是id的文件寫入buffer中長度為size字節(jié)的數(shù)據(jù)4)、int Read(char *buffer, int size, OpenFileId id);從標(biāo)志符是id的文件讀取長度為size字節(jié)的數(shù)據(jù)存入buffer,返回實(shí)際讀取的字節(jié)數(shù)5)、void Close(OpenFileId id);關(guān)閉標(biāo)志符是id的文件2種系統(tǒng)調(diào)用涉及用戶級(jí)線程,用于支持多線程用戶程序:1)、void Fork(void (*func)();創(chuàng)建和當(dāng)前線程擁有相同地址空間的線程,運(yùn)行fun

5、c指針指向的函數(shù)2)、void Yield();當(dāng)前線程讓出CPUcode/userprog/exception.cc定義進(jìn)行異常處理的ExceptionHandler函數(shù),主要流程是根據(jù)異常信息處理不同異常,包括系統(tǒng)調(diào)用目前支持的異常: NoException, / 正常 SyscallException, / 系統(tǒng)調(diào)用PageFaultException, / 缺頁(頁表/快表)ReadOnlyException, / 訪問只讀頁面 BusErrorException, / 總線錯(cuò)誤AddressErrorException, / 訪問地址對(duì)齊錯(cuò)誤/超出范圍 OverflowExcepti

6、on, / 算數(shù)溢出 IllegalInstrException, / 非法指令 NumExceptionTypes處理系統(tǒng)調(diào)用時(shí),需要從2號(hào)寄存器獲得系統(tǒng)調(diào)用號(hào)確定系統(tǒng)調(diào)用類型code/test/start.s是輔助用戶程序運(yùn)行的匯編代碼,主要包括初始化用戶程序和系統(tǒng)調(diào)用相關(guān)操作(1)初始化用戶程序:通過調(diào)用main函數(shù)運(yùn)行用戶程序.globl _start.ent_start_start:jalmain /跳轉(zhuǎn)到main函數(shù)執(zhí)行用戶程序move$4,$0 /main函數(shù)返回 /r4寄存器存入0,作為下面調(diào)用Exit參數(shù)jalExit .end _start(2)系統(tǒng)調(diào)用:用戶程序執(zhí)行系統(tǒng)調(diào)

7、用時(shí),將系統(tǒng)調(diào)用號(hào)存入r2寄存器,然后跳轉(zhuǎn)到exception.cc執(zhí)行,例如系統(tǒng)調(diào)用Halt:Halt: addiu $2,$0,SC_Halt/將系統(tǒng)調(diào)用號(hào)存入r2寄存器syscallj$31.end Halt系統(tǒng)調(diào)用相關(guān)寄存器:r2-系統(tǒng)調(diào)用號(hào),系統(tǒng)調(diào)用返回值r4-系統(tǒng)調(diào)用參數(shù)1r5-系統(tǒng)調(diào)用參數(shù)2r6-系統(tǒng)調(diào)用參數(shù)3r7-系統(tǒng)調(diào)用參數(shù)4系統(tǒng)調(diào)用主要流程:machine的Run函數(shù)運(yùn)行用戶程序,實(shí)現(xiàn)在machine/mipssim.cc,基本流程是通過OneInstruction函數(shù)完成指令譯碼和執(zhí)行,通過interrupt的OneTick函數(shù)使得時(shí)鐘前進(jìn)(1) OneInstructi

8、on函數(shù)判斷當(dāng)前指令是系統(tǒng)調(diào)用,轉(zhuǎn)入start.s(2) 通過start.s確定系統(tǒng)調(diào)用入口,通過寄存器r2傳遞系統(tǒng)調(diào)用號(hào),轉(zhuǎn)入exception.cc(此時(shí)系統(tǒng)調(diào)用參數(shù)位于相應(yīng)寄存器)(3) exception.cc通過系統(tǒng)調(diào)用號(hào)識(shí)別系統(tǒng)調(diào)用,進(jìn)行相關(guān)處理,如果系統(tǒng)調(diào)用存在返回值,那么通過寄存器r2傳遞,流程結(jié)束時(shí),需要更新PC(4) 系統(tǒng)調(diào)用結(jié)束,程序繼續(xù)執(zhí)行添加系統(tǒng)調(diào)用:(1) syscall.h定義系統(tǒng)調(diào)用接口、系統(tǒng)調(diào)用號(hào)(2)code/test/start.s添加鏈接代碼(3)exception.cc添加系統(tǒng)調(diào)用處理過程二、文件系統(tǒng)相關(guān)的系統(tǒng)調(diào)用Exercise 2 系統(tǒng)調(diào)用實(shí)現(xiàn)類比

9、Halt的實(shí)現(xiàn),完成與文件系統(tǒng)相關(guān)的系統(tǒng)調(diào)用:Create, Open,Close,Write,Read。Syscall.h文件中有這些系統(tǒng)調(diào)用基本說明。基本思路:修改userprog/exception.cc,按照userprog/syscall.h的定義實(shí)現(xiàn)系統(tǒng)調(diào)用系統(tǒng)調(diào)用Create定義void Create(char *name);系統(tǒng)調(diào)用Create基本流程(1) 通過寄存器r4獲得文件名指針(2) 使用文件名指針通過已經(jīng)實(shí)現(xiàn)ReadMem函數(shù)獲得文件名(3) 通過已經(jīng)實(shí)現(xiàn)的Create函數(shù)創(chuàng)建文件(4) 通過函數(shù)PC_advance更新PC系統(tǒng)調(diào)用Open定義OpenFileId

10、Open(char *name);系統(tǒng)調(diào)用Open基本流程(1)通過寄存器r4獲得文件名指針(2)使用文件名指針通過已經(jīng)實(shí)現(xiàn)ReadMem函數(shù)獲得文件名(3)通過已經(jīng)實(shí)現(xiàn)的Open函數(shù)打開文件(4)返回值(打開文件數(shù)據(jù)結(jié)構(gòu))寫入寄存器r2(5)通過函數(shù)PC_advance更新PC系統(tǒng)調(diào)用Close定義void Close(OpenFileId id);系統(tǒng)調(diào)用Close基本流程(1) 通過寄存器r4獲得打開文件數(shù)據(jù)結(jié)構(gòu)(2) 通過打開文件數(shù)據(jù)結(jié)構(gòu)析構(gòu)函數(shù)關(guān)閉文件(3) 通過函數(shù)PC_advance更新PC系統(tǒng)調(diào)用Read定義int Read(char *buffer, int size, Op

11、enFileId id);系統(tǒng)調(diào)用Read基本流程(1) 通過寄存器r4獲得緩沖區(qū)指針,通過寄存器r5獲得數(shù)據(jù)長度,通過寄存器r6獲得打開文件數(shù)據(jù)結(jié)構(gòu)(2) 通過已經(jīng)實(shí)現(xiàn)的Read函數(shù)讀取文件相關(guān)內(nèi)容,記錄實(shí)際讀出字節(jié)數(shù)(3) 通過已經(jīng)實(shí)現(xiàn)的WriteMem函數(shù)將文件內(nèi)容寫入緩沖區(qū)(4) 返回值(實(shí)際讀出字節(jié)數(shù))寫入寄存器r2(5) 通過函數(shù)PC_advance更新PC系統(tǒng)調(diào)用Write定義void Write(char *buffer, int size, OpenFileId id);系統(tǒng)調(diào)用Write基本流程(1)通過寄存器r4獲得緩沖區(qū)指針,通過寄存器r5獲得數(shù)據(jù)長度,通過寄存器r6獲

12、得打開文件數(shù)據(jù)結(jié)構(gòu)(2)通過已經(jīng)實(shí)現(xiàn)的ReadMem函數(shù)獲得緩沖區(qū)數(shù)據(jù)(3)通過已經(jīng)實(shí)現(xiàn)的Write函數(shù)將緩沖區(qū)內(nèi)容寫入文件(4)通過函數(shù)PC_advance更新PCExercise 3 編寫用戶程序編寫并運(yùn)行用戶程序,調(diào)用練習(xí)2中所寫系統(tǒng)調(diào)用,測試其正確性。用戶程序基本思路創(chuàng)建文件write.txt(系統(tǒng)調(diào)用Create)打開文件read.txt(已經(jīng)存在,內(nèi)容hello_world)(系統(tǒng)調(diào)用Open)打開文件write.txt(系統(tǒng)調(diào)用Open)讀入文件read.txt內(nèi)容,記錄讀入字節(jié)數(shù)(系統(tǒng)調(diào)用Read)內(nèi)容寫入文件write.txt(系統(tǒng)調(diào)用Write)關(guān)閉文件read.txt(系

13、統(tǒng)調(diào)用Close)關(guān)閉文件write.txt(系統(tǒng)調(diào)用Close)用戶程序的添加修改test/MakeFileall: halt shell matmult sort test1test1.o: test1.c$(CC) $(CFLAGS) -c test1.ctest1: test1.o start.o$(LD) $(LDFLAGS) start.o test1.o -o test1.coff./bin/coff2noff test1.coff test1用戶程序的執(zhí)行檢查userprog文件夾,出現(xiàn)文件write.txt可以發(fā)現(xiàn),相關(guān)內(nèi)容順利寫入,符合實(shí)際三、執(zhí)行用戶程序相關(guān)的系統(tǒng)調(diào)用Ex

14、ercise 4 系統(tǒng)調(diào)用實(shí)現(xiàn)實(shí)現(xiàn)如下系統(tǒng)調(diào)用:Exec,F(xiàn)ork,Yield,Join,Exit。Syscall.h文件中有這些系統(tǒng)調(diào)用基本說明。系統(tǒng)調(diào)用Exec定義SpaceId Exec(char *name);系統(tǒng)調(diào)用Exec基本流程(1) 通過寄存器r4獲得文件名指針(2) 建立線程,通過函數(shù)exec_func執(zhí)行用戶程序(3) 返回值(線程ID)寫入寄存器r2(4) 通過函數(shù)PC_advance更新PC函數(shù)exec_func基本流程(1)使用文件名指針通過已經(jīng)實(shí)現(xiàn)ReadMem函數(shù)獲得文件名(2)通過已經(jīng)實(shí)現(xiàn)的Open函數(shù)打開文件(3)通過已經(jīng)實(shí)現(xiàn)的AddrSpace的構(gòu)造函數(shù)初始

15、化地址空間(4)通過已經(jīng)實(shí)現(xiàn)的InitRegisters函數(shù)初始化寄存器(5)通過已經(jīng)實(shí)現(xiàn)的RestoreState函數(shù)裝載頁表(6)通過已經(jīng)實(shí)現(xiàn)的Run函數(shù)運(yùn)行用戶程序重要部分可以仿照StartProcess函數(shù)實(shí)現(xiàn)系統(tǒng)調(diào)用Fork定義void Fork(void (*func)();系統(tǒng)調(diào)用Fork基本流程(1) 通過寄存器r4獲得函數(shù)位置(2) 復(fù)制當(dāng)前進(jìn)程地址空間注意到AddrSpace的構(gòu)造函數(shù)需要打開文件作為輸入,所以增加線程屬性,記錄當(dāng)前線程對(duì)應(yīng)打開文件的名稱,實(shí)現(xiàn)Fork函數(shù)時(shí),需要逐頁復(fù)制頁表內(nèi)容(3) 建立線程,執(zhí)行函數(shù)fork_func(4) 通過函數(shù)PC_advance

16、更新PC函數(shù)Fork_func基本流程(1) 設(shè)置當(dāng)前線程地址空間(2)通過已經(jīng)實(shí)現(xiàn)的InitRegisters函數(shù)初始化寄存器(3)通過已經(jīng)實(shí)現(xiàn)的RestoreState函數(shù)裝載頁表(4)設(shè)置當(dāng)前線程PC(5)通過已經(jīng)實(shí)現(xiàn)的Run函數(shù)運(yùn)行用戶程序系統(tǒng)調(diào)用Yield定義void Yield();系統(tǒng)調(diào)用Yield基本流程(1) 通過函數(shù)PC_advance更新PC(2) 通過已經(jīng)實(shí)現(xiàn)的Yield函數(shù)實(shí)現(xiàn)線程切換這里需要先更新PC,否則陷入死循環(huán)系統(tǒng)調(diào)用Join定義int Join(SpaceId id); 系統(tǒng)調(diào)用Join基本流程(1)通過寄存器r4獲得線程ID(2)檢查全局?jǐn)?shù)組ThreadI

17、D,確定特定線程是否處于活躍狀態(tài),如果特定線程處于活躍狀態(tài),那么進(jìn)行線程切換根據(jù)前面已經(jīng)實(shí)現(xiàn)的機(jī)制,線程構(gòu)造函數(shù)會(huì)分配線程ID,線程析構(gòu)函數(shù)會(huì)回收線程ID,所以能夠通過線程ID確定特定線程是否處于活躍狀態(tài)(3)通過函數(shù)PC_advance更新PC系統(tǒng)調(diào)用Exit定義void Exit(int status)系統(tǒng)調(diào)用Exit基本流程(1) 通過寄存器r4獲得退出狀態(tài),輸出相關(guān)信息(2) 通過已經(jīng)實(shí)現(xiàn)的clear函數(shù)釋放頁表相關(guān)空間(3) 通過函數(shù)PC_advance更新PC(4) 通過已經(jīng)實(shí)現(xiàn)的Finish函數(shù)結(jié)束當(dāng)前線程Exercise 5 編寫用戶程序 編寫并運(yùn)行用戶程序,調(diào)用練習(xí)4中所寫系

18、統(tǒng)調(diào)用,測試其正確性。用戶程序1基本思路(1)通過系統(tǒng)調(diào)用Exec執(zhí)行特定文件(2)通過系統(tǒng)調(diào)用Yield進(jìn)行線程切換涉及系統(tǒng)調(diào)用:Exec、Yield、Exit#include syscall.hint main() Exec(halt); Yield();用戶程序1執(zhí)行結(jié)果(1) 主線程分配空間,開始執(zhí)行(2) 執(zhí)行系統(tǒng)調(diào)用Exec,建立新線程,準(zhǔn)備執(zhí)行halt(3) 執(zhí)行系統(tǒng)調(diào)用Yield,主線程進(jìn)行線程切換(4) 新線程分配地址空間,開始執(zhí)行(5) 新線程執(zhí)行完成,執(zhí)行系統(tǒng)調(diào)用Exit,釋放地址空間,輸出相關(guān)信息(6)主線程執(zhí)行完成,執(zhí)行系統(tǒng)調(diào)用Exit,釋放地址空間,輸出相關(guān)信息結(jié)果

19、如下,符合實(shí)際 用戶程序2基本思路(1)通過系統(tǒng)調(diào)用Exec執(zhí)行特定文件(2)通過系統(tǒng)調(diào)用Join等待新線程結(jié)束涉及系統(tǒng)調(diào)用:Exec、Join、Exit#include syscall.hint main() int id = Exec(halt); Join(id);用戶程序2執(zhí)行結(jié)果(1)主線程分配空間,開始執(zhí)行(2)執(zhí)行系統(tǒng)調(diào)用Exec,建立新線程,準(zhǔn)備執(zhí)行halt(3)執(zhí)行系統(tǒng)調(diào)用Join,新線程沒有結(jié)束,主線程進(jìn)行線程切換(4)新線程分配地址空間,開始執(zhí)行(5)新線程執(zhí)行完成,執(zhí)行系統(tǒng)調(diào)用Exit,釋放地址空間,輸出相關(guān)信息(6)主線程執(zhí)行完成,執(zhí)行系統(tǒng)調(diào)用Exit,釋放地址空間,輸出相關(guān)信息結(jié)果如下,符合實(shí)際 用戶程序3基本思路(1)通過系統(tǒng)調(diào)用Fork建立新線程(2)新線程執(zhí)行相關(guān)操作涉及系統(tǒng)調(diào)用:Fork、Exit#include syscall.hvoid func(

溫馨提示

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

評(píng)論

0/150

提交評(píng)論