操作系统课设--系统调用
山東大學(xué)操作系統(tǒng)課設(shè)lab6
- 實驗六 系統(tǒng)調(diào)用(lab6)
- 實驗?zāi)康?/li>
- 實驗環(huán)境
- 實驗思路
- 調(diào)試記錄
實驗六 系統(tǒng)調(diào)用(lab6)
實驗?zāi)康?/h2>
擴展現(xiàn)有的class AddrSpace的實現(xiàn),使得Nachos可以實現(xiàn)多用戶程序。
按照實驗指導(dǎo)書中的方法,完成class AddrSpace中的print函數(shù)。
實現(xiàn)Nachos 系統(tǒng)調(diào)用:Exec()。
實驗環(huán)境
虛擬機下Ubuntu Linux 16.04 LTS系統(tǒng),nachos-3.4內(nèi)核管理模塊和MIPS CPU軟件模擬模塊,代碼在lab6文件夾下面實現(xiàn)。
實驗思路
有參考這個網(wǎng)頁:https://blog.csdn.net/mottled233/article/details/78633571
先看machine文件夾,里面有一個mipssim.cc,mipssim是模擬器的意思,可以模擬一個完整系統(tǒng)的窗口:代碼窗口、寄存器窗口、流水線窗口、時鐘周期圖窗口、內(nèi)存窗口、統(tǒng)計窗口和斷點窗口,我認(rèn)為是模擬用戶程序的完整過程。有一個Run()方法,應(yīng)該是在運行整個系統(tǒng),for循環(huán)里每條指令都作為參數(shù)依次傳入OneInstruction()中。
然后看看OneInstruction(),感覺主體是一堆的case。當(dāng)執(zhí)行不同的指令時,寄存器的數(shù)組里存放不同的數(shù)。
case的這些語句中,有一個對本實驗很重要的語句,即系統(tǒng)調(diào)用的情況。
可以看出,它是拋出了一個系統(tǒng)調(diào)用的異常。這里直接return了,而沒有break,會導(dǎo)致無限循環(huán),而不是直接跳出可以進行下一步。這個SyscallException可以在userprog的exception.cc中找到。
現(xiàn)在已有的程序只對halt這一種情況的系統(tǒng)調(diào)用進行了處理,之后要補充。
然后可以看到實驗要求說要實現(xiàn)系統(tǒng)調(diào)用:Exec()。Exec()是指在一個進程中啟動另一個進程執(zhí)行的方法。而exit()是用來使進程中止的。
Exec()系統(tǒng)調(diào)用可以在userprog的syscall.h中找到。可以從方法中看出,根據(jù)name啟動了另一個進程的執(zhí)行,并行執(zhí)行,并返回新的程序的內(nèi)存空間標(biāo)識符給SpaceId。
通過exception.cc可以看出,系統(tǒng)調(diào)用的參數(shù)傳遞與一般函數(shù)的參數(shù)傳遞不同,它的傳遞參數(shù)和返回值都要用寄存器保存。其中,傳遞參數(shù)保存在r4-r7,返回值保存在r2。
關(guān)鍵源代碼注釋以及程序說明:
只用把userprog放進lab6里就好,其他要改的直接在當(dāng)前文件夾中修改。
需要修改…/bin/arch/unknown-i386-linux/bin/coff2noff的權(quán)限,使其可執(zhí)行。
用sudo chmod -R 777 某一目錄可以解決
其中
-R 是指級聯(lián)應(yīng)用到目錄里的所有子目錄和文件
777 是所有用戶都擁有最高權(quán)限
然后是exception.cc,我認(rèn)為這是最重要的一個文件。原來它只是提供了一種情況的異常處理方法,本題中要求的exec和exit都沒有提供,所以要自己寫,補充上這兩條的case就好。看的網(wǎng)上說,為了讓格式好看一些把原本就有的Halt也寫到case里,格式統(tǒng)一一些。
然后加上exec()和exit()
其中AdvancePC()、StartProcess()也寫在exception.cc,不過在各種case的處理前。
為了設(shè)置全局唯一標(biāo)識,需要一個屬性記錄這個標(biāo)識,并給其賦初始值。
在system.h和system.cc里設(shè)置一個數(shù)組ThreadMap去標(biāo)識它,system.cc里既要賦初值,也要記得刪掉的。賦初值可以用bzero(),也可以直接for循環(huán)。
最后在test文件夾里添加exe.c和修改halt.c,調(diào)用exec()和exit()。如下:
調(diào)試記錄
./nachos -x …/test/halt.noff
如果想要打印,就./nachos -d m -x …/test/halt.noff
得到了一堆bug。說我重復(fù)定義,error太多了,但是最后一行只說error 1,所以大概是一種錯誤。我本來以為導(dǎo)入時要把.h和.cc都include的,因為.h只是定義嘛,.cc才是真正實現(xiàn),但是原來只要include.h就好了,因為.cc都已經(jīng)被.h include過了,所以就如果兩次include,會有重復(fù)定義,我把所有include的.cc都刪了就好了。
得到:
然后我發(fā)現(xiàn)我和正確答案好像不大一樣,加了print()
現(xiàn)在的輸出:
輸出顯示一直都使的是同樣的物理頁,沒增加,是有問題的。本來物理頁是等于i,調(diào)整成去扇區(qū)里尋找就好了。
其實這個實驗還是沒有搞懂原理。
總結(jié)
以上是生活随笔為你收集整理的操作系统课设--系统调用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统课设--具有二级索引的文件系统
- 下一篇: java信息管理系统总结_java实现科