




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、系統(tǒng)調(diào)用實習報告目錄內(nèi)容一:總體概述3內(nèi)容二:任務完成情況3任務完成列表(Y/N)3具體Exercise的完成情況3內(nèi)容三:遇到的困難以及解決方法16內(nèi)容四:收獲及感想16內(nèi)容五:對課程的意見和建議16內(nèi)容六:參考文獻16內(nèi)容一:總體概述 本次lab的主要內(nèi)容是實現(xiàn)nachos定義的系統(tǒng)調(diào)用。理論方面,我們需要了解nachos系統(tǒng)調(diào)用的實現(xiàn)原理,實踐方面,我們需要實現(xiàn)文進系統(tǒng)相關(guān)系統(tǒng)調(diào)用和用戶程序相關(guān)系統(tǒng)調(diào)用,并且編寫用戶程序驗證相關(guān)系統(tǒng)調(diào)用的正確性。內(nèi)容二:任務完成情況任務完成列表(Y/N)Exercise1Exercise2Exercise3Exercise4Exercise5YYYYY具
2、體Exercise的完成情況一、理解Nachos系統(tǒng)調(diào)用Exercise 1 源代碼閱讀 閱讀與系統(tǒng)調(diào)用相關(guān)的源代碼,理解系統(tǒng)調(diào)用的實現(xiàn)原理。 code/userprog/syscall.h code/userprog/exception.cccode/test/start.suserprog/syscall.h定義nachos的系統(tǒng)調(diào)用,主要包括系統(tǒng)調(diào)用號和系統(tǒng)調(diào)用函數(shù),內(nèi)核通過識別用戶程序傳遞的系統(tǒng)調(diào)用號確定系統(tǒng)調(diào)用類型已經(jīng)實現(xiàn)的系統(tǒng)調(diào)用包括void Halt(); 關(guān)閉nachos虛擬機,打印性能統(tǒng)計信息需要實現(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í)行文件,返回其地址空間的標志符SpaceId實際是整型,標識地址空間3)、int Join(SpaceId id); 等待標志符為id的用戶線程運行完畢,返回其退出狀態(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文件,返回打開文件標志符OpenFileId實際是整形,標識
4、打開文件3)、void Write(char *buffer, int size, OpenFileId id);向標志符是id的文件寫入buffer中長度為size字節(jié)的數(shù)據(jù)4)、int Read(char *buffer, int size, OpenFileId id);從標志符是id的文件讀取長度為size字節(jié)的數(shù)據(jù)存入buffer,返回實際讀取的字節(jié)數(shù)5)、void Close(OpenFileId id);關(guān)閉標志符是id的文件2種系統(tǒng)調(diào)用涉及用戶級線程,用于支持多線程用戶程序:1)、void Fork(void (*func)();創(chuàng)建和當前線程擁有相同地址空間的線程,運行fun
5、c指針指向的函數(shù)2)、void Yield();當前線程讓出CPUcode/userprog/exception.cc定義進行異常處理的ExceptionHandler函數(shù),主要流程是根據(jù)異常信息處理不同異常,包括系統(tǒng)調(diào)用目前支持的異常: NoException, / 正常 SyscallException, / 系統(tǒng)調(diào)用PageFaultException, / 缺頁(頁表/快表)ReadOnlyException, / 訪問只讀頁面 BusErrorException, / 總線錯誤AddressErrorException, / 訪問地址對齊錯誤/超出范圍 OverflowExcepti
6、on, / 算數(shù)溢出 IllegalInstrException, / 非法指令 NumExceptionTypes處理系統(tǒng)調(diào)用時,需要從2號寄存器獲得系統(tǒng)調(diào)用號確定系統(tǒng)調(diào)用類型code/test/start.s是輔助用戶程序運行的匯編代碼,主要包括初始化用戶程序和系統(tǒng)調(diào)用相關(guān)操作(1)初始化用戶程序:通過調(diào)用main函數(shù)運行用戶程序.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、用時,將系統(tǒng)調(diào)用號存入r2寄存器,然后跳轉(zhuǎn)到exception.cc執(zhí)行,例如系統(tǒng)調(diào)用Halt:Halt: addiu $2,$0,SC_Halt/將系統(tǒng)調(diào)用號存入r2寄存器syscallj$31.end Halt系統(tǒng)調(diào)用相關(guān)寄存器:r2-系統(tǒng)調(dià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ù)運行用戶程序,實現(xiàn)在machine/mipssim.cc,基本流程是通過OneInstruction函數(shù)完成指令譯碼和執(zhí)行,通過interrupt的OneTick函數(shù)使得時鐘前進(1) OneInstructi
8、on函數(shù)判斷當前指令是系統(tǒng)調(diào)用,轉(zhuǎn)入start.s(2) 通過start.s確定系統(tǒng)調(diào)用入口,通過寄存器r2傳遞系統(tǒng)調(diào)用號,轉(zhuǎn)入exception.cc(此時系統(tǒng)調(diào)用參數(shù)位于相應寄存器)(3) exception.cc通過系統(tǒng)調(diào)用號識別系統(tǒng)調(diào)用,進行相關(guān)處理,如果系統(tǒng)調(diào)用存在返回值,那么通過寄存器r2傳遞,流程結(jié)束時,需要更新PC(4) 系統(tǒng)調(diào)用結(jié)束,程序繼續(xù)執(zhí)行添加系統(tǒng)調(diào)用:(1) syscall.h定義系統(tǒng)調(diào)用接口、系統(tǒng)調(dià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)用實現(xiàn)類比
9、Halt的實現(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的定義實現(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)實現(xiàn)ReadMem函數(shù)獲得文件名(3) 通過已經(jīng)實現(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)實現(xiàn)ReadMem函數(shù)獲得文件名(3)通過已經(jīng)實現(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)實現(xiàn)的Read函數(shù)讀取文件相關(guān)內(nèi)容,記錄實際讀出字節(jié)數(shù)(3) 通過已經(jīng)實現(xiàn)的WriteMem函數(shù)將文件內(nèi)容寫入緩沖區(qū)(4) 返回值(實際讀出字節(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)實現(xiàn)的ReadMem函數(shù)獲得緩沖區(qū)數(shù)據(jù)(3)通過已經(jīng)實現(xiàn)的Write函數(shù)將緩沖區(qū)內(nèi)容寫入文件(4)通過函數(shù)PC_advance更新PCExercise 3 編寫用戶程序編寫并運行用戶程序,調(diào)用練習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)容順利寫入,符合實際三、執(zhí)行用戶程序相關(guān)的系統(tǒng)調(diào)用Ex
14、ercise 4 系統(tǒng)調(diào)用實現(xiàn)實現(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)實現(xiàn)ReadMem函數(shù)獲得文件名(2)通過已經(jīng)實現(xiàn)的Open函數(shù)打開文件(3)通過已經(jīng)實現(xiàn)的AddrSpace的構(gòu)造函數(shù)初始
15、化地址空間(4)通過已經(jīng)實現(xiàn)的InitRegisters函數(shù)初始化寄存器(5)通過已經(jīng)實現(xiàn)的RestoreState函數(shù)裝載頁表(6)通過已經(jīng)實現(xiàn)的Run函數(shù)運行用戶程序重要部分可以仿照StartProcess函數(shù)實現(xiàn)系統(tǒng)調(diào)用Fork定義void Fork(void (*func)();系統(tǒng)調(diào)用Fork基本流程(1) 通過寄存器r4獲得函數(shù)位置(2) 復制當前進程地址空間注意到AddrSpace的構(gòu)造函數(shù)需要打開文件作為輸入,所以增加線程屬性,記錄當前線程對應打開文件的名稱,實現(xiàn)Fork函數(shù)時,需要逐頁復制頁表內(nèi)容(3) 建立線程,執(zhí)行函數(shù)fork_func(4) 通過函數(shù)PC_advance
16、更新PC函數(shù)Fork_func基本流程(1) 設(shè)置當前線程地址空間(2)通過已經(jīng)實現(xiàn)的InitRegisters函數(shù)初始化寄存器(3)通過已經(jīng)實現(xiàn)的RestoreState函數(shù)裝載頁表(4)設(shè)置當前線程PC(5)通過已經(jīng)實現(xiàn)的Run函數(shù)運行用戶程序系統(tǒng)調(diào)用Yield定義void Yield();系統(tǒng)調(diào)用Yield基本流程(1) 通過函數(shù)PC_advance更新PC(2) 通過已經(jīng)實現(xiàn)的Yield函數(shù)實現(xiàn)線程切換這里需要先更新PC,否則陷入死循環(huán)系統(tǒng)調(diào)用Join定義int Join(SpaceId id); 系統(tǒng)調(diào)用Join基本流程(1)通過寄存器r4獲得線程ID(2)檢查全局數(shù)組ThreadI
17、D,確定特定線程是否處于活躍狀態(tài),如果特定線程處于活躍狀態(tài),那么進行線程切換根據(jù)前面已經(jīng)實現(xiàn)的機制,線程構(gòu)造函數(shù)會分配線程ID,線程析構(gòu)函數(shù)會回收線程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)實現(xiàn)的clear函數(shù)釋放頁表相關(guān)空間(3) 通過函數(shù)PC_advance更新PC(4) 通過已經(jīng)實現(xiàn)的Finish函數(shù)結(jié)束當前線程Exercise 5 編寫用戶程序 編寫并運行用戶程序,調(diào)用練習4中所寫系
18、統(tǒng)調(diào)用,測試其正確性。用戶程序1基本思路(1)通過系統(tǒng)調(diào)用Exec執(zhí)行特定文件(2)通過系統(tǒng)調(diào)用Yield進行線程切換涉及系統(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í)行halt(3) 執(zhí)行系統(tǒng)調(diào)用Yield,主線程進行線程切換(4) 新線程分配地址空間,開始執(zhí)行(5) 新線程執(zhí)行完成,執(zhí)行系統(tǒng)調(diào)用Exit,釋放地址空間,輸出相關(guān)信息(6)主線程執(zhí)行完成,執(zhí)行系統(tǒng)調(diào)用Exit,釋放地址空間,輸出相關(guān)信息結(jié)果
19、如下,符合實際 用戶程序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í)行halt(3)執(zhí)行系統(tǒng)調(diào)用Join,新線程沒有結(jié)束,主線程進行線程切換(4)新線程分配地址空間,開始執(zhí)行(5)新線程執(zhí)行完成,執(zhí)行系統(tǒng)調(diào)用Exit,釋放地址空間,輸出相關(guān)信息(6)主線程執(zhí)行完成,執(zhí)行系統(tǒng)調(diào)用Exit,釋放地址空間,輸出相關(guān)信息結(jié)果如下,符合實際 用戶程序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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 研發(fā)組工作管理制度
- 花崗巖礦山管理制度
- 茶會所日常管理制度
- 藥房質(zhì)量部管理制度
- 衢州華外九英語第二次月考試卷及答案
- 財務會計個人工作心得經(jīng)典10篇
- 課程標準解讀心得體會
- 公司swot分析(上汽案例)(論文資料)
- 財務會計與核算管理知識分析解答
- 財務報表分析及財務分析概論自考真題及答案
- 2025年湖北省高考政治試卷真題(含答案)
- 廣東省深圳市寶安區(qū)2023-2024學年二年級下冊期末測試數(shù)學試卷(含答案)
- 2025江蘇揚州寶應縣“鄉(xiāng)村振興青年人才”招聘67人筆試備考試題及參考答案詳解
- 2025公基題庫(附答案解析)
- 2025年寧夏銀川靈武市選聘市屬國有企業(yè)管理人員招聘筆試沖刺題(帶答案解析)
- 三大監(jiān)測培訓試題及答案
- 兩辦意見宣貫考試題及答案
- 2025年汽車駕照考試科目一考試題庫及參考答案
- 跨文化交際知識體系及其前沿動態(tài)
- 音響安裝施工合同協(xié)議
- 日本簽證個人信息處理同意書
評論
0/150
提交評論