今天仔细研究了Nachos的系统调用(主要阅读Nachos Study Book.pdf),基本上理解了Nachos系统调用的过程.

首先来明确一下系统调用的概念,系统调用是指用户程序调用系统提供的程序接口,而使系统进入内核态执行对应功能代码的过程。Nachos模拟了这一机制.那么Nachos是如何模拟的呢?

当用户程序调用系统调用接口时,Nachos会执行与此系统调用相对应的Stub.系统调用的Stub定义在start.s文件中.Stub主要完成三件事情.

  1. 将系统调用号写入2号寄存器
  2. 执行syscall指令
  3. 返回到31号寄存器存放的地址处,该地址为用户程序返回地址.
这里说的系统调用号,是Nachos为系统调用接口指定的一个整形编号,该编号定义在syscall.h文件中,syscall.h文件中还定义了系统调用接口.syscall.h的部分文件内容如下:
#define SC_Halt        0
#define SC_Exit     1
#define SC_Exec     2
#define SC_Join     3
#define SC_Create   4
#define SC_Open     5
#define SC_Read     6
#define SC_Write    7
#define SC_Close    8
#define SC_Fork     9
#define SC_Yield    10void Halt();      void Exit(int status);  SpaceId Exec(char *name);int Join(SpaceId id);  
默认情况下,Nachos定义了11个系统调用号,每个号对应一个系统调用.比如SC_Halt为0,对应着系统调用Halt.
syscall指令又是做什么的呢?当系统执行syscall指令时,在MIPS R2/3000处理器的模拟器中会捕获该指令,对应的代码在mipssim.cc的OneInstruction()方法中:代码如下:
      case OP_SYSCALL:RaiseException(SyscallException, 0);return; 

处理器当发现执行该指令时,会调用RaiseException(SyscallException,0)方法来抛出一个SyscallException异常,那么RaiseException方法(定义在machine.cc中)内到底做了什么呢?见代码:

void Machine::RaiseException(ExceptionType which, int badVAddr)
{DEBUG('m', "Exception: %s\n", exceptionNames[which]);//  ASSERT(interrupt->getStatus() == UserMode);registers[BadVAddrReg] = badVAddr;DelayedLoad(0, 0);         // finish anything in progressinterrupt->setStatus(SystemMode);ExceptionHandler(which);      // interrupts are enabled at this pointinterrupt->setStatus(UserMode);
}

从interrupt->setStatus(SystemMode)你可以看出,此时系统进入核心态,接着执行ExceptionHandler(witch),ExceptionHandler方法在exception内进行实现,那么该方法到底做什么了呢?见代码:

void ExceptionHandler(ExceptionType which)
{int type = machine->ReadRegister(2);if ((which == SyscallException) && (type == SC_Halt)) {DEBUG('a', "Shutdown, initiated by user program.\n");interrupt->Halt();} else {printf("Unexpected user mode exception %d %d\n", which, type);ASSERT(FALSE);}
}

从这段代码中可以看出,首先从2号寄存处中取出系统调用号,然后判断发生的异常是不是SyscallException和系统调用好是不是SC_Halt如果是,则调用interrupt->Halt()执行Halt()方法的具体代码.注意这儿有两个条件判断,一是判断不是系统调用异常,而是根据系统调用号执行系统调用的具体代码.此处只对Halt系统调用进行了处理,我们可以在这儿扩展其他系统调用的处理代码。

执行完ExceptionHandler后,会回到machine.cc的RaiseException代码,继续执行interrupt->setStatus(UserModel),重新回到用户态.RaiseException方法执行完后,回到Stub继续执行返回用户程序指令j $31。回到用户程序继续执行。
上述阐述了系统调用的过程,Nachos的系统调用时序图如下所示(以Halt调用为例):

Nachos之系统调用相关推荐

  1. Nachos系统调用的实现

    实验目的 模仿code/test/add.c,阅读并理解其实现过程,实现求乘法,除法两种系统调用. 了解并掌握Linux下nachos的系统调用 实验内容 在/userprog/syscall.h中进 ...

  2. 【nachos】山东大学操作系统课设实验nachos系统(6)系统调用Exec()和Exit()

    实验目的 尝试实现系统调用Exec() 和 Exit() 实验步骤 需要注意,在前三个步骤不需要修改代码. 一.nachos中系统调用的实现机制 观察nachos/machine/machine,mi ...

  3. 操作系统课设--系统调用

    山东大学操作系统课设lab6 实验六 系统调用(lab6) 实验目的 实验环境 实验思路 调试记录 实验六 系统调用(lab6) 实验目的 扩展现有的class AddrSpace的实现,使得Nach ...

  4. Nachos指南(一)

    Nachos是一个教学用的操作系统,它提供了一个操作系统的骨架来支持线程,用户级别进程,虚拟内存以及中断驱动的输入输出设备.Nachos和实际的操作系统的区别在于它是作为一个独立的UNIX进程运行,而 ...

  5. Nachos实习——Lab2虚拟内存实习报告

    Nachos实习--Lab2虚拟内存实习报告 文章目录 Nachos实习--Lab2虚拟内存实习报告 内容一:总体概述 内容二:任务完成情况 内容三:具体完成Exercise情况 一.TLB异常处理 ...

  6. 山东大学软件学院操作系统课程设计(2021秋季,nachos)实验1

    〇.前言 这几天翻到自己去年做的课程设计,感觉当时理解得还是挺深的(之前一直没觉得自己写得多认真,现在读起来觉得,嗯,虽然我只负责一半的实验,但给我98分真的不亏/doge),三篇半实验报告写了近一万 ...

  7. Nachos Lab4 文件系统

    Lab4 文件系统 todo:makedep [实习建议] 数据结构的修改和维护 文件管理的升级基于对原有Nachos数据结构的修改.增加文件的描述信息需对文件头结构进行简单修改.多级目录中可创建目录 ...

  8. 山东大学软件学院操作系统课程设计(2021秋季,nachos)实验6

    一.实验内容 二.源码分析 1. 理解nachos单线程地址映射机制 Machine::Run()中调用Machine::OneInstruction(Instruction *instr)逐条执行可 ...

  9. 实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    贺邦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用库函数 ...

最新文章

  1. xml 属性value换行显示_python 标准库之xml.etree.ElementTree
  2. IDE使用经验——阿里代码规范 Eclipse格式化代码配置
  3. java中的path类_详谈java中File类getPath()、getAbsolutePath()、getCanonical的区别
  4. html一个空格多少像素,一个空格占几个字符?
  5. azure blob_在Azure中使用表,blob,队列和文件存储
  6. 把“~/niunantest.aspx”转成http://localhost:4532/test/niunantest.aspx的方法
  7. vscode推荐插件的安装
  8. QQ VS MSN——QQ “只爱陌生人”,MSN “不和陌生人说话”
  9. [散文]茶想(作者:王莹莹)
  10. Layui 数据表格合并单元格
  11. palantir_Palantir开源的两个库– Cinch和Sysmon
  12. aop:aspectj-autoproxy /作用
  13. 时统ptp_【学术论文】麒麟操作系统平台软时统同步方法研究
  14. 微信小程序作品集实例:跨页面传参,数据库,换行,空格,css
  15. GitWeb服务器搭建
  16. Python-玩转数据-selenium库
  17. 参加科学教师与计算机培训总结报告,教师计算机培训心得总结
  18. mysql和stata_501 stata如何连接MySQL
  19. oracle修改clob值,oracle修改字段类型由varchar2修改为clob类型
  20. 爬取某招聘网站的招聘信息(猎聘)

热门文章

  1. python:迭代器对象,迭代器和迭代
  2. 深度Deepin系统关机或重启的时候提示unattended upgrades shutdown的解决办法
  3. mxnet 数据操作
  4. sublime和vscode 格式化Json ——两步走
  5. [激光原理与应用-65]:激光器-器件 - 多模光纤(宽频光纤)、单模光纤的原理与区别
  6. 响应式设计中怎样布局?
  7. Qt5.5 双屏的显示笔记
  8. 轻量级UPF N4接口开放性技术研究与应用
  9. 读书笔记 -- 《瓦尔登湖》
  10. ERP系统常用SQL集锦