操作系统试验-Nachos系统调用实现

操作系统试验-Nachos系统调用实现提示 看到的学弟学妹们不要想着 copy 哈 认真琢磨操作系统是一件非常有意思的事 目录实验题目一 实验目的 环境二 实验步骤总结 1 Nachos 是什么 2 预备知识 3 文件结构分析 4 nachos

大家好,欢迎来到IT知识分享网。

提示:看到的学弟学妹们不要想着copy哈,认真琢磨操作系统是一件非常有意思的事!


实验题目

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面步骤仅供参考

一、实验目的、环境

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、实验步骤

  1. 在/userprog/syscall.h中进行宏定义和函数声明

请添加图片描述

  1. 在/userprog/ksyscall.h中实现函数的功能
    请添加图片描述
  2. 在mipssim.cc可看到nachos执行系统调用的方法是升起异常——调用中断处理函数。
    在这里插入图片描述

因此下一步是在/userprog/exception.cc中通过switch实现对不同指令的响应功能,以及对异常进行处理。
请添加图片描述
此处仅以mul实例

  1. 在/test/start.s中补充汇编指令代码,实现系统调用
    我们可以观察到Add函数的实现是将系统调用类型(type)SC_Add放入了2号寄存器中,然后执行syscall。因此直接模仿改写。
    请添加图片描述

5.在test文件夹下增加test.c,实现函数调用
请添加图片描述

  1. 修改makefile 使得test.c正确编译
    请添加图片描述
  2. 在/test路径下清除先前的编译结果,再make编译
    请添加图片描述
  3. 在/build.linux路径下make进行全局编译并运行
    请添加图片描述

总结

1.Nachos是什么?

Nachos (Not Another Completely Heuristic Operating System),是一个教学用操作系统,提供了操作系统框架:

  1. 线程
  2. 中断
  3. 虚拟内存(位图管理所有物理页,虚拟地址与物理地址之间的转换等)
  4. 同步与互斥机制(锁、条件变量、信号量),读者写者问题,生产者消费者问题,BARRIER问题等
  5. 线程调度(基于优先级可抢占式调度,时间片轮转算法,FIFO调度)
  6. 文件系统
  7. 系统调用
  8. 机器指令、汇编指令、寄存器
    ……
    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种系统调用。

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以变成之前的NextPC kernel->machine->WriteRegister(NextPCReg, kernel->machine->ReadRegister(PCReg)+4); } return; ASSERTNOTREACHED(); break; 

后记


第一次认真写博客,希望能坚持。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/148470.html

(0)
上一篇 2025-03-30 20:00
下一篇 2025-03-30 20:10

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信