Nachos系统调用实习报告

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

系统调用实习报告

善良的大姐姐

2015.5.3

目录

一:总体概述 (3)

二:任务完成情况 (3)

任务完成列表(Y/N) (3)

具体Exercise的完成情况 (3)

三:遇到的困难以及解决方法 (19)

四:收获及感想 (20)

五:对课程的意见和建议 (20)

六:参考文献 (20)

一:总体概述

自lab4我们完成了虚拟内存的实习,可以运行用户程序之后,我们就考虑加入系统调用。即,用户程序可以通过特定的系统调用,陷入Nachos内核,从而完成特定的目标。本次lab一共要求完成10个系统调用,包括两大部分,文件系统相关——Create,Open,Close,Read,Write;用户程序相关——Exec,Fork,Yield,Join,Exit。需要在阅读和理解源码的基础上,知道系统调用的执行流程,进一步修增源代码,实现新增的系统调用功能。

二:任务完成情况

任务完成列表(Y/N)

具体Exercise的完成情况

Exercise 1:源代码阅读

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

完成情况:

1.Syscall.h

概述:

1)定义了每个系统调用对应的系统调用号

2)声明了每个系统调用

概述:对系统陷入进行处理。

1)从machine的2号寄存器读入系统调用号

2)执行对应的操作代码(需要自己完成)

3)(如果需要)将返回值写回Machine的2号寄存器

3.Start.s

概述:当用户程序执行一个系统调用的时候,将参数放入2号寄存器,然后跳转到执行。以Halt为例:

4. 总结

当用户希望执行一条系统调用的时候:

1) 在用户程序中调用 2) 当这条语句被OneInstruction 函数解析执行时,会判断出这是一条系统调用,转入start.s

3) 在start.s 中找到系统调用对应的入口(可能需要自己增加),将系统调用号放入machine 的2号寄存器,并转入

4) 在 中,读出2号寄存器中的系统调用号,执行对应操作

5) 必要时,将返回值写回2号寄存器,并注意,将PC 前进。 6) 指令回到用户程序系统调用的下一条继续执行。系统调用完成。

为了执行一条系统调用,我们需要完成的部分: 1) 自己写一个用于测试的用户程序的.c 文件,并修改test 的Makefile ,使得用户程序能够被Nachos 系统执行。

2) 因为本次lab 需要写的系统调用,在start.s 中都已经写好了,因此我们不需要修改。同样,syscall.h 中,系统调用号和函数声明也都写好了。(但如果希望自己新增系统调用,这两个文件是需要修改的,修改方式可以参照别的系统调用)

3) 补充 ,执行对应的系统调用操作。

Exercise 2: 系统调用实现

任务:类比Halt 的实现,完成与文件系统相关的系统调用:Create, Open ,Close ,Write ,

Read 。Syscall.h 文件中有这些系统调用基本说明。

将系统调用号放入2号寄存器

第一步:增加需要编译的文件名

称。这两个是我新增的

第二步,增加如何编译的信息。

Exercise 3: 编写用户程序

任务:编写并运行用户程序,调用练习2中所写系统调用,测试其正误。

E X2+EX3完成情况:

首先,在完成了文件系统的lab之后,为了能够让userprog编译通过,需要修改system.h的makefile,多include几个头文件以及声明extern变量。否则,会出现:undefined reference *** 这种情况。

其次,我们需要在中,加入系统调用入口:

1.void Create(char *name)

概述:

1)从4号寄存器读入文件名指针

2)利用指针,从Machine的mainmemory(内存)中,读出文件名

3)用文件名为参数,调用filesystem的create函数,创建文件(默认长度256byte)

4)将PC前移:(中定义)

代码:(从内存中读出文件名部分)

测试截图:

之后在userprog文件夹下,就出现了a.txt这个文件(因为我是用UNIX的文件系统来做这次lab的)

2.OpenFileId Open(char *name)

概述:

1)从4号寄存器读入文件名指针

2)利用指针,从Machine的mainmemory(内存)中,读出文件名3)用文件名为参数,调用filesystem的open函数,打开文件,返回OpenFile指针(在Nachos系统中,OpenFile相当于是文件描述符)

4)将OpenFile指针写回machine的2号寄存器(machine->WriteRegister(2,(int)openfile))

5)PC前移

代码:(Openfile写回部分)

测试截图:(打开失败)(Open成功会配合之后的系统调用再进行测试截图)

3.void Close(OpenFileId id)

概述:

1)从4号寄存器中读出OpenFile的指针

2)调用filesystem的close方法,将openfile关闭(自己编写的close 方法,其中将传入的OpenFile指针delete掉)

3)PC前移

代码:(从寄存器中读出Openfile指针+关闭部分)

测试截图:(Close配合open系统调用测试截图)

相关文档
最新文档