nachos-Lab6实习报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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