Lab1Nachos系统调用.ppt

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

default: cerr << "Unexpected system call "
<< type << "\n"; break;
} break; default: cerr << "Unexpected user mode exception" << (int)which << "\n"; break; } ASSERTNOTREACHED(); }
来自百度文库
execution starts from here
/code/userprog/ Exception.cc
case SC_Write: result = SysWrite();
/code/userprog/ ksyscall.h
int SysWrite(){ }
• 编译:
o 1)code/test目录下make产生shell.noff o 2)code/build.linux 目录下make产生nachos
…… Write(prompt, 2, output);
……
}
generate a hardware trap into nachos kernel RaiseException() /code/machine/ Mipssim.cc
/code/userprog/syscall.h #define SC_Write 8
Nachos 系统调用实验
week 7
系统调用概述 时间安排 实验要求
目录
系统调用概述1/6
• 系统调用的概念
o 将一些同硬件或者和操作系统功能有密切联系的一部分常用指 令序列抽取出来,使它们成为操作系统本身的一部分,这就是 所谓的系统调用
系统调用概述2/6
• 系统调用概述
o 一般的UNIX操作系统提供几十条甚至上百条系统调用,系统调 用的多少取决于操作系统的复杂程度及其主要的适用范围。只 有用户态的程序才能进行系统调用,进行系统调用后的状态变 成系统态,一般程序在系统态运行会有较高的优先级。系统调 用作为操作系统的一部分,它们是长驻内存的。操作系统提供 的系统调用太少,会影响用户程序的执行效率和用途;因为不 是每种应用都会用到所有的系统调用,系统调用数目太多,则 会使得操作系统的核心过于庞大而同样影响系统的效率。
(或make clean,再make)
• 测试运行
o 在code/build.linux 目录下./nachos – x ../test/shell.noff
o 或者在code/test目录下../build.linux/nachos – x shell.noff
The end…. Thank you~~
系统调用概述6/6
• Halt系统调用是没有参数的,对于有参数的系统调用, MIPS编译决定了参数传递的以下规则
参数1: 参数2: 参数3: 参数4:
r4寄存器 r5寄存器 r6寄存器 r7寄存器
时间安排
• 实验一:Nachos系统调用
o week 10 ~ week 12
• 实验二:Nachos线程管理模块升级
int Write(char *buffer, int size, OpenFileId id);
/code/test/start.s
#include "syscall.h” start:
jal main move $4,$0 jal Exit .end __start Write: addiu $2,$0,SC_Write syscall j $31 .end Write
系统调用概述3/6
• Nachos 系统调用
o Nachos的系统调用函数定义在Userprog\ksyscall.h头文件中,其 运行机制与linux 的系统调用相似。
o 在该文件中定义了两个系统调用,分别为: • SysHalt():实现中断操作 • SysAdd():实现两个数的相加操作
系统调用概述4/6
o week 13 ~ week 14
• 实验三:Nachos内存管理模块升级
o week 15 ~ week 17
实验一要求
• 实现Nachos的基本系统调用:
Write, Read, Exec, Join
/code/test/shell.c #include “syscall.h”
int main() {
Halt
Halt: addin
$2, $0, SC_Halt
syscall J .end
$31 其中addin $2, $0, SC_Halt语句的作 Halt 用是在r2寄存器中存放系统调用的类
别码SC_Halt,即Halt系统调用。
系统调用概述5/6
• start.s同ExceptionHandler()配合使用,完成整个调用过程:
void ExceptionHandler(ExceptionType which){ //取出系统调用代码
int type = machine->ReadRegister(2); DEBUG(dbgSys, "Received Exception " << which << " type: " << type << "\n");
• 以Halt系统调用为例进行分析:
• 在Nachos中,系统调用的其它异常陷入的入口处理函数都是 Userprog下的ExceptionHandler函数,只是陷入的类型为 SyscallException。在test目录下的start.s模块中描述了具体的系 统调用过程
.globl
Halt
.ent
switch (which) { case SyscallException:
switch(type) { case SC_Halt: DEBUG(dbgSys, "Shutdown, initiated by user program.\n"); SysHalt(); ASSERTNOTREACHED(); break;
相关文档
最新文档