nachos-La的b6实习报告.docVIP

  • 1
  • 0
  • 约6.23千字
  • 约 16页
  • 2018-02-18 发布于浙江
  • 举报
nachos-La的b6实习报告

系统调用实习报告 目录 内容一:总体概述 3 内容二:任务完成情况 3 任务完成列表(Y/N) 3 具体Exercise的完成情况 3 内容三:遇到的困难以及解决方法 16 内容四:收获及感想 16 内容五:对课程的意见和建议 16 内容六:参考文献 16 内容一:总体概述 本次lab的主要内容是实现nachos定义的系统调用。理论方面,我们需要了解nachos系统调用的实现原理,实践方面,我们需要实现文进系统相关系统调用和用户程序相关系统调用,并且编写用户程序验证相关系统调用的正确性。 内容二:任务完成情况 任务完成列表(Y/N) Exercise1 Exercise2 Exercise3 Exercise4 Exercise5 Y Y Y Y Y 具体Exercise的完成情况 一、理解Nachos系统调用 Exercise 1 源代码阅读 阅读与系统调用相关的源代码,理解系统调用的实现原理。 code/userprog/syscall.h code/userprog/exception.cc code/test/start.s userprog/syscall.h定义nachos的系统调用,主要包括系统调用号和系统调用函数,内核通过识别用户程序传递的系统调用号确定系统调用类型 已经实现的系统调用包括 void Halt(); 关闭nachos虚拟机,打印性能统计信息 需要实现的系统调用包括: 3种系统调用涉及地址空间: 1)、void Exit(int status); 用户程序完成,status = 0表示正常退出 2)、SpaceId Exec(char *name); 加载并执行名字是name的Nachos可执行文件,返回其地址空间的标志符 SpaceId实际是整型,标识地址空间 3)、int Join(SpaceId id); 等待标志符为id的用户线程运行完毕,返回其退出状态 5种系统调用涉及文件系统: 1)、void Create(char *name); 创建文件名name的Nachos文件 、OpenFileId Open(char *name); 打开文件名name的Nachos文件,返回打开文件标志符 OpenFileId实际是整形,标识打开文件 3)、void Write(char *buffer, int size, OpenFileId id); 向标志符是id的文件写入buffer中长度为size字节的数据 4)、int Read(char *buffer, int size, OpenFileId id); 从标志符是id的文件读取长度为size字节的数据存入buffer,返回实际读取的字节数 5)、void Close(OpenFileId id); 关闭标志符是id的文件 2种系统调用涉及用户级线程,用于支持多线程用户程序: 1)、void Fork(void (*func)()); 创建和当前线程拥有相同地址空间的线程,运行func指针指向的函数 2)、void Yield(); 当前线程让出CPU code/userprog/exception.cc定义进行异常处理的ExceptionHandler函数,主要流程是根据异常信息处理不同异常,包括系统调用 目前支持的异常: NoException, // 正常 SyscallException, // 系统调用 PageFaultException, // 缺页(页表/快表) ReadOnlyException, // 访问只读页面 BusErrorException, // 总线错误 AddressErrorException, // 访问地址对齐错误/超出范围 OverflowException, // 算数溢出 IllegalInstrException, // 非法指令 NumExceptionTypes 处理系统调用时,需要从2号寄存器获得系统调用号确定系统调用类型 code/test/start.s是辅助用户程序运行的汇编代码,主要包括初始化用户程序和系统调用相关操作 (1)初始化用户程序:通过调用main函数运行用户程序 .globl __start .ent __start __start: jal main //跳转到main函数执行用户程序 move $4,$0 //main函数返回 //r4寄存器存入0,作为下面调用Exit参数 jal Exit .end __startHalt: a

文档评论(0)

1亿VIP精品文档

相关文档