nachos-Lab6实习报告

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

系统调用实习报告

目录

内容一:总体概述..................................... 错误!未定义书签。内容二:任务完成情况................................. 错误!未定义书签。

任务完成列表(Y/N).............................. 错误!未定义书签。

具体Exercise的完成情况.......................... 错误!未定义书签。内容三:遇到的困难以及解决方法....................... 错误!未定义书签。内容四:收获及感想................................... 错误!未定义书签。内容五:对课程的意见和建议........................... 错误!未定义书签。内容六:参考文献..................................... 错误!未定义书签。

内容一:总体概述

本次lab的主要内容是实现nachos定义的系统调用。理论方面,我们需要了解nachos系统调用的实现原理,实践方面,我们需要实现文进系统相关系统调用和用户程序相关系统调用,并且编写用户程序验证相关系统调用的正确性。

内容二:任务完成情况

任务完成列表(Y/N)

具体Exercise的完成情况

一、理解Nachos系统调用

Exercise 1 源代码阅读

阅读与系统调用相关的源代码,理解系统调用的实现原理。

code/userprog/

code/userprog/

code/test/

userprog/定义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文件

2)、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/定义进行异常处理的ExceptionHandler函数,主要流程是根据异常信息处理不同异常,包括系统调用

目前支持的异常:

NoException, lobl __start

.ent __start

__start:

jal main nd __start

(2)系统调用:用户程序执行系统调用时,将系统调用号存入r2寄存器,然后跳转到执行,例如系统调用Halt:

Halt:

addiu $2,$0,SC_Halt nd Halt

系统调用相关寄存器:

r2->系统调用号,系统调用返回值

r4->系统调用参数1

r5->系统调用参数2

r6->系统调用参数3

r7->系统调用参数4

系统调用主要流程:

machine的Run函数运行用户程序,实现在machine/,基本流程是通过OneInstruction函数完成指令译码和执行,通过interrupt的OneTick函数使得时钟前进

(1)OneInstruction函数判断当前指令是系统调用,转入

(2)通过确定系统调用入口,通过寄存器r2传递系统调用号,转入(此时系统调用参数位于相应寄存器)

(3)通过系统调用号识别系统调用,进行相关处理,如果系统调用存在返回值,那么通过寄存器r2传递,流程结束时,需要更新PC

(4)系统调用结束,程序继续执行

添加系统调用:

(1)定义系统调用接口、系统调用号

(2)code/test/添加链接代码

(3)添加系统调用处理过程

二、文件系统相关的系统调用

Exercise 2 系统调用实现

类比Halt的实现,完成与文件系统相关的系统调用:Create, Open,Close,Write,Read。文件中有这些系统调用基本说明。

基本思路:

修改userprog/,按照userprog/的定义实现系统调用

系统调用Create定义

void Create(char *name);

系统调用Create基本流程

(1)通过寄存器r4获得文件名指针

(2)使用文件名指针通过已经实现ReadMem函数获得文件名

(3)通过已经实现的Create函数创建文件

(4)通过函数PC_advance更新PC

相关文档
最新文档