操作系统试验-Nachos系统调用实现
提示:看到的學弟學妹們不要想著copy哈,認真琢磨操作系統是一件非常有意思的事!
目錄
- 實驗題目
- 一、實驗目的、環境
- 二、實驗步驟
- 總結
- 1.Nachos是什么?
- 2.預備知識
- 3.文件結構分析
- 4.nachos用戶程序運行流程
- 4. ExceptionHandler()分析
- 后記
實驗題目
提示:以下是本篇文章正文內容,下面步驟僅供參考
一、實驗目的、環境
二、實驗步驟
在/userprog/ksyscall.h中實現函數的功能
在mipssim.cc可看到nachos執行系統調用的方法是升起異常——調用中斷處理函數。
因此下一步是在/userprog/exception.cc中通過switch實現對不同指令的響應功能,以及對異常進行處理。
此處僅以mul實例
我們可以觀察到Add函數的實現是將系統調用類型(type)SC_Add放入了2號寄存器中,然后執行syscall。因此直接模仿改寫。
5.在test文件夾下增加test.c,實現函數調用
修改makefile 使得test.c正確編譯
在/test路徑下清除先前的編譯結果,再make編譯
在/build.linux路徑下make進行全局編譯并運行
總結
1.Nachos是什么?
Nachos (Not Another Completely Heuristic Operating System),是一個教學用操作系統,提供了操作系統框架:
……
Nachos模擬了一個MIPS模擬器,運行用戶程序。
2.預備知識
addiu $2 $0 SC_Write 即0號寄存器的值與SC_Write的調用號相加并存入2號寄存器,其中0號寄存器的值恒為0.
系統傳遞參數>4:x64匯編傳遞超過4個參數
返回值非整數:可采用指向返回字符串/結構體的指針。
3.文件結構分析
code/userprog/syscall.h:這里定義了Nachos中的系統調用號,以及相應的系統調用接口。Nachos目前共有11種系統調用。
code/userprog/exception.cc:這里定義了異常處理函數。當異常發生的時候,ExceptionHandler函數會被調用。系統調用也是異常的一種,即SyscallException。然后根據從寄存器中讀到的系統調用號,來進行相應的處理。
code/test/start.s:用于輔助Nachos中用戶程序的執行。該文件共有兩個作用,其一是定義程序執行時跳轉到main函數,以及程序執行結束時調用Exit系統調用。另一個作用是,實現了用戶程序的系統調用接口,該接口會將參數放在寄存器中,并跳轉到異常處理函數執行相應的處理。
4.nachos用戶程序運行流程
4. ExceptionHandler()分析
//mul case SC_Mul://終端輸出信息DEBUG(dbgSys, "Mul " << kernel->machine->ReadRegister(4) << " * " << kernel->machine->ReadRegister(5) << "\n");/* Process SysMul Systemcall*/int resultMul;resultMul = SysMul(/* int op1 */(int)kernel->machine->ReadRegister(4),/* int op2 */(int)kernel->machine->ReadRegister(5));DEBUG(dbgSys, "Mul returning with " << resultMul << "\n");/* Prepare Result *///從2號寄存器中取值kernel->machine->WriteRegister(2, (int)resultMul);/* Modify return point */ //即PC+1{/* set previous programm counter (debugging only)*/kernel->machine->WriteRegister(PrevPCReg, kernel->machine->ReadRegister(PCReg));/* set programm counter to next instruction (all Instructions are 4 byte wide)*/kernel->machine->WriteRegister(PCReg, kernel->machine->ReadRegister(PCReg) + 4);/* set next programm counter for brach execution *///注意此時的PC以變成之前的NextPCkernel->machine->WriteRegister(NextPCReg, kernel->machine->ReadRegister(PCReg)+4);}return;ASSERTNOTREACHED();break;后記
第一次認真寫博客,希望能堅持。
總結
以上是生活随笔為你收集整理的操作系统试验-Nachos系统调用实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 记录请求的耗时(拦截器、过滤器、aspe
- 下一篇: nachos操作系统初步认识