Nachos系統(tǒng)調(diào)用實習報告_第1頁
Nachos系統(tǒng)調(diào)用實習報告_第2頁
Nachos系統(tǒng)調(diào)用實習報告_第3頁
Nachos系統(tǒng)調(diào)用實習報告_第4頁
Nachos系統(tǒng)調(diào)用實習報告_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

系統(tǒng)調(diào)用實習報告善良的大姐姐.5.3

目錄一:總體概述 3二:任務(wù)完畢狀況 3任務(wù)完畢列表(Y/N) 3具體Exercise的完畢狀況 3三:碰到的困難以及解決辦法 18四:收獲及感想 19五:對課程的意見和建議 19六:參考文獻 19一:總體概述 自lab4我們完畢了虛擬內(nèi)存的實習,能夠運行顧客程序之后,我們就考慮加入系統(tǒng)調(diào)用。即,顧客程序能夠通過特定的系統(tǒng)調(diào)用,陷入Nachos內(nèi)核,從而完畢特定的目的。本次lab一共規(guī)定完畢10個系統(tǒng)調(diào)用,涉及兩大部分,文獻系統(tǒng)有關(guān)——Create,Open,Close,Read,Write;顧客程序有關(guān)——Exec,F(xiàn)ork,Yield,Join,Exit。需要在閱讀和理解源碼的基礎(chǔ)上,懂得系統(tǒng)調(diào)用的執(zhí)行流程,進一步修增源代碼,實現(xiàn)新增的系統(tǒng)調(diào)用功效。二:任務(wù)完畢狀況任務(wù)完畢列表(Y/N)Exercise1Exercise2Exercise3Exercise4Exercise5YesYesYesYesYes具體Exercise的完畢狀況Exercise1:源代碼閱讀 任務(wù):閱讀與系統(tǒng)調(diào)用有關(guān)的源代碼,理解系統(tǒng)調(diào)用的實現(xiàn)原理。 完畢狀況:Syscall.h概述:定義了每個系統(tǒng)調(diào)用對應(yīng)的系統(tǒng)調(diào)用號聲明了每個系統(tǒng)調(diào)用Exception.cc概述:對系統(tǒng)陷入進行解決。從machine的2號寄存器讀入系統(tǒng)調(diào)用號執(zhí)行對應(yīng)的操作代碼(需要自己完畢)(如果需要)將返回值寫回Machine的2號寄存器 Start.s概述:當顧客程序執(zhí)行一種系統(tǒng)調(diào)用的時候,將參數(shù)放入2號寄存器,然后跳轉(zhuǎn)到exception.cc執(zhí)行。以Halt為例:將系統(tǒng)調(diào)用號放入2號寄存器將系統(tǒng)調(diào)用號放入2號寄存器總結(jié)當顧客但愿執(zhí)行一條系統(tǒng)調(diào)用的時候:在顧客程序中調(diào)用當這條語句被OneInstruction函數(shù)解析執(zhí)行時,會判斷出這是一條系統(tǒng)調(diào)用,轉(zhuǎn)入start.s在start.s中找到系統(tǒng)調(diào)用對應(yīng)的入口(可能需要自己增加),將系統(tǒng)調(diào)用號放入machine的2號寄存器,并轉(zhuǎn)入exception.cc在exception.cc中,讀出2號寄存器中的系統(tǒng)調(diào)用號,執(zhí)行對應(yīng)操作必要時,將返回值寫回2號寄存器,并注意,將PC邁進。指令回到顧客程序系統(tǒng)調(diào)用的下一條繼續(xù)執(zhí)行。系統(tǒng)調(diào)用完畢。 為了執(zhí)行一條系統(tǒng)調(diào)用,我們需要完畢的部分:第一步:增加需要編譯的文獻名稱。這兩個是我新增的自己寫一種用于測試的顧客程序的.c文獻,并修改test的Makefile,使得顧客程序能夠被Nachos系統(tǒng)執(zhí)行。第一步:增加需要編譯的文獻名稱。這兩個是我新增的第二步,增加如何編譯的信息。第二步,增加如何編譯的信息。由于本次lab需要寫的系統(tǒng)調(diào)用,在start.s中都已經(jīng)寫好了,因此我們不需要修改。同樣,syscall.h中,系統(tǒng)調(diào)用號和函數(shù)聲明也都寫好了。(但如果但愿自己新增系統(tǒng)調(diào)用,這兩個文獻是需要修改的,修改方式能夠參考別的系統(tǒng)調(diào)用)補充exception.cc,執(zhí)行對應(yīng)的系統(tǒng)調(diào)用操作。Exercise2:系統(tǒng)調(diào)用實現(xiàn) 任務(wù):類比Halt的實現(xiàn),完畢與文獻系統(tǒng)有關(guān)的系統(tǒng)調(diào)用:Create,Open,Close,Write,Read。Syscall.h文獻中有這些系統(tǒng)調(diào)用基本闡明。Exercise3:編寫顧客程序 任務(wù):編寫并運行顧客程序,調(diào)用練習2中所寫系統(tǒng)調(diào)用,測試其正誤。 EX2+EX3完畢狀況: 首先,在完畢了文獻系統(tǒng)的lab之后,為了能夠讓userprog編譯通過,需要修改system.h的makefile,多include幾個頭文獻以及聲明extern變量。否則,會出現(xiàn):undefinedreference***這種狀況。另首先,我們需要在exception.cc中,加入系統(tǒng)調(diào)用入口:voidCreate(char*name)概述:從4號寄存器讀入文獻名指針運用指針,從Machine的mainmemory(內(nèi)存)中,讀出文獻名用文獻名為參數(shù),調(diào)用filesystem的create函數(shù),創(chuàng)立文獻(默認長度256byte)將PC前移:(machine.cc中定義)代碼:(從內(nèi)存中讀出文獻名部分) 測試截圖: 之后在userprog文獻夾下,就出現(xiàn)了a.txt這個文獻(由于我是用UNIX的文獻系統(tǒng)來做這次lab的)OpenFileIdOpen(char*name)概述: 從4號寄存器讀入文獻名指針運用指針,從Machine的mainmemory(內(nèi)存)中,讀出文獻名用文獻名為參數(shù),調(diào)用filesystem的open函數(shù),打開文獻,返回OpenFile指針(在Nachos系統(tǒng)中,OpenFile相稱于是文獻描述符) 將OpenFile指針寫回machine的2號寄存器(machine->WriteRegister(2,(int)openfile))PC前移代碼:(Openfile寫回部分)測試截圖:(打開失?。∣pen成功會配合之后的系統(tǒng)調(diào)用再進行測試截圖)voidClose(OpenFileIdid)概述:從4號寄存器中讀出OpenFile的指針調(diào)用filesystem的close辦法,將openfile關(guān)閉(自己編寫的close辦法,其中將傳入的OpenFile指針delete掉)PC前移代碼:(從寄存器中讀出Openfile指針+關(guān)閉部分) 測試截圖:(Close配合open系統(tǒng)調(diào)用測試截圖)注意:打開文獻返回的文獻指針,和關(guān)閉文獻時讀取的文獻指針相似。關(guān)閉文獻打開文獻創(chuàng)立文獻注意:打開文獻返回的文獻指針,和關(guān)閉文獻時讀取的文獻指針相似。關(guān)閉文獻打開文獻創(chuàng)立文獻intRead(char*buffer,intsize,OpenFileIdid)概述:從4號寄存器讀出來裝載字符串的指針從5號寄存器讀出需要讀取的字符串長度從6號寄存器讀出OpenFile的指針調(diào)用openfile的read函數(shù),從光標位置讀出一定長度的字符串,存入臨時數(shù)組當中將讀出來的內(nèi)容,寫回machine的mainmemory中,寫入的位置就是字符串指針依次往后。將openfile的read函數(shù)的返回值,寫入2號寄存器當中。代碼: 測試截圖:(見write部分,兩者配合測試。)voidWrite(char*buffer,intsize,OpenFileIdid)概述:從4號寄存器讀出來裝載字符串的指針從5號寄存器讀出需要讀取的字符串長度從6號寄存器讀出OpenFile的指針從machine的mainmemory中,從字符串指針位置開始,持續(xù)讀出字符串長度個字符將讀出來的內(nèi)容,調(diào)用OpenFile的write辦法,寫入文獻當中。代碼: 測試截圖:單獨測試write成功寫入但愿寫入的內(nèi)容成功寫入但愿寫入的內(nèi)容配合read一起測試字符的起始位置都是同樣的。打開文獻b,將a讀取的內(nèi)容寫入b(指針也相似~)打開文獻a,讀取文獻a(指針相似)字符的起始位置都是同樣的。打開文獻b,將a讀取的內(nèi)容寫入b(指針也相似~)打開文獻a,讀取文獻a(指針相似)Exercise4:系統(tǒng)調(diào)用實現(xiàn) 任務(wù):實現(xiàn)以下系統(tǒng)調(diào)用:Exec,F(xiàn)ork,Yield,Join,Exit。Syscall.h文獻中有這些系統(tǒng)調(diào)用基本闡明。Exercise5:編寫顧客程序 任務(wù):編寫并運行顧客程序,調(diào)用練習4中所寫系統(tǒng)調(diào)用,測試其對的性。 EX4+EX5完畢狀況: 首先,為了能夠使得Join和Exec的系統(tǒng)調(diào)用,能夠在父子進程之間發(fā)生聯(lián)系,我們需要在thread.h中加入Thread*childThread[MaxThreadSize],用于統(tǒng)計現(xiàn)在線程的子線程的thread指針。這個數(shù)組在thread的構(gòu)造函數(shù)中初始化,初始值均為NULL。還需要加入Thread*fatherThread變量,用于統(tǒng)計現(xiàn)在線程的父線程(如果存在)。同樣在構(gòu)造函數(shù)中進行初始化,初始賦值為自己。SpaceIdExec(char*name))概述:從4號寄存器中讀出名字指針,并仿照EX2中的做法,從mainmemory中獲得名字。新創(chuàng)立一種線程在現(xiàn)在線程的childThread數(shù)組中,尋找與否尚有空位,如果有,賦值給新創(chuàng)立的線程,標明父子關(guān)系,并且將新線程的指針號寫回2號寄存器。接著,將新創(chuàng)立線程的fatherThread指針賦值為currentThread。新線程這時能夠調(diào)用Fork,執(zhí)行一段代碼。最后,PC前移如果沒有空位,輸出錯誤信息,將PC前移。Fork執(zhí)行的代碼:參考progtest中,startprocess函數(shù),先是打開這個顧客程序文獻,然后新創(chuàng)立一種地址空間,接著初始化machine,最后讓machine->run。代碼:Fork之后調(diào)用的函數(shù):解決系統(tǒng)調(diào)用的代碼: 測試截圖: (和之后的join+exit一起測)intJoin(SpaceIdid)概述:從4號寄存器中讀出要等待的子線程的OpenFile指針找到自己的childThread數(shù)組中,這個OpenFile指針對應(yīng)的位置While循環(huán),當這個位置不為NULL時,調(diào)用currentThread->Yield(),等待子線程結(jié)束跳出while循環(huán)后,將子線程的結(jié)束狀態(tài)寫入2號寄存器,PC前移代碼: 測試截圖: (配合Exec和Exit一起測)voidExit(intstatus)概述:由于lab4虛擬內(nèi)存中,需要在exit系統(tǒng)調(diào)用中釋放page和清空tlb,因此此處繼續(xù)保存這兩個功效。判斷:如果現(xiàn)在exit的線程不是根本程:如果現(xiàn)在線程有父線程,將父線程中對應(yīng)的自己設(shè)立為NULL(表明自己已經(jīng)要退出啦?。⑶艺{(diào)用currentThread->Finish()如果是根本程:PC前移測試截圖:(配合之前的Exec和Exit)測試函數(shù):Mytest函數(shù):Mytest函數(shù):測試截圖:根本程此時執(zhí)行完了Exec,開始執(zhí)行Join系統(tǒng)調(diào)用。由于在等待的子線程尚未結(jié)束,于是讓位CPU由于時間片到了,此時切換到根本程準備在新線程的新的顧客空間中運行Mytest新根本程此時執(zhí)行完了Exec,開始執(zhí)行Join系統(tǒng)調(diào)用。由于在等待的子線程尚未結(jié)束,于是讓位CPU由于時間片到了,此時切換到根本程準備在新線程的新的顧客空間中運行Mytest新線程創(chuàng)立自己的顧客空間新Fork出來的線程(設(shè)立優(yōu)先級更高,于是立刻搶占)切換根本程執(zhí)行Exec系統(tǒng)調(diào)用根本程調(diào)用Exit退出。新線程根本程調(diào)用Exit退出。新線程執(zhí)行完畢了,切換到根本程。根本程由于上次PC沒前移,于是再次調(diào)用Join。本次成功了。新線程執(zhí)行mytest中的內(nèi)容:Create一種文獻,然后Exit退出(EXIT中會釋放物理頁)voidFork(void(*func)())概述:從4號寄存器中讀出要執(zhí)行的顧客函數(shù)的起始PC新創(chuàng)立一種線程,并參考Exec中的環(huán)節(jié),完畢父子關(guān)系的建立PC前移。在Fork的系統(tǒng)函數(shù)中,完畢準備工作:將父進程的顧客空間(Pagetable)拷貝到子進程中;將machine現(xiàn)在的PC值修改為1)中的PC值,NextPC值修改為1)中的PC值+4;將修改完畢的這套寄存器值寄存到新線程的寄存器當中(其中,除了兩個PC值,其它的都和父進程相似?。㎝achine->Run(),就能夠跳轉(zhuǎn)到顧客函數(shù)執(zhí)行了。注意:開始時刻,子進程和父進程的寄存器值,除了PC不同,別的都相似。子進程和父進程使用同樣的pagetable。子進程和父進程共享machine的??臻g(因此子進程不必重設(shè)棧空間)代碼: 測試截圖:顧客函數(shù)執(zhí)行。(與左側(cè)圖片中顯示的代碼對應(yīng))顧客函數(shù)執(zhí)行。(與左側(cè)圖片中顯示的代碼對應(yīng))Fork_func部分(見上),準備工作。voidYield()概述:PC前移調(diào)用currentThread->Yield()(注意,此處兩者不能調(diào)換次序,由于一旦現(xiàn)在線程yield了,下一次再上CPU,是不會從沒執(zhí)行完的系統(tǒng)調(diào)用處開始,而是會從PC現(xiàn)在對應(yīng)的指令開始的。如果沒有提前將PC前移,那么下一次,還會執(zhí)行Yield系統(tǒng)調(diào)用,就陷入了死循環(huán))代碼:測試截圖:Mytest函數(shù)測試函數(shù)Mytest函數(shù)測試成果新線程執(zhí)行Yield,于是切換到根本程。根本程在新線程執(zhí)行Yield,于是切換到根本程。根本程在等待子線程完畢,于是又切換回子線程這一塊和之前的截圖分析的相似切換回子線程之后,子線程繼續(xù)執(zhí)行打開操作(這里的亂碼我也不懂得為什么。)切換回子線程之后,子線程繼續(xù)執(zhí)行打開操作(這里的亂碼我也不懂得為什么。)三:碰到的困難以及解決辦法困難1:Userprog編譯不通過編譯userprog始終提示undefinedreference:thread/synchdisk啦,bitmap啦……感覺很疑惑。原來是在system.h中,IFDEFUSER_PROGRAM中,需要include這幾項。詳見EX2+EX3完畢狀況中對此的闡明及截圖。困難2:當對同個文獻執(zhí)行read和write時,如果先write再read,會出現(xiàn)讀出來的東西都是亂碼的狀況這是由于兩者共享了同個文獻的文獻指針(OpenFile指針),如果先write,此時文獻指針已經(jīng)移到了文獻的末尾,再執(zhí)行

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論