- 1、本文档共19页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
系统调用实习报告
善良的大姐姐
.5.3
目录
TOC \o 1-3 \h \z \u 一:总体概述 3
二:任务完毕状况 3
任务完毕列表(Y/N) 3
具体Exercise的完毕状况 3
三:碰到的困难以及解决办法 18
四:收获及感想 19
五:对课程的意见和建议 19
六:参考文献 19
一:总体概述
自lab4我们完毕了虚拟内存的实习,能够运行顾客程序之后,我们就考虑加入系统调用。即,顾客程序能够通过特定的系统调用,陷入Nachos内核,从而完毕特定的目的。本次lab一共规定完毕10个系统调用,涉及两大部分,文献系统有关——Create,Open,Close,Read,Write;顾客程序有关——Exec,Fork,Yield,Join,Exit。需要在阅读和理解源码的基础上,懂得系统调用的执行流程,进一步修增源代码,实现新增的系统调用功效。
二:任务完毕状况
任务完毕列表(Y/N)
Exercise1
Exercise2
Exercise3
Exercise4
Exercise5
Yes
Yes
Yes
Yes
Yes
具体Exercise的完毕状况
Exercise 1:源代码阅读
任务:阅读与系统调用有关的源代码,理解系统调用的实现原理。
完毕状况:
Syscall.h
概述:
定义了每个系统调用对应的系统调用号
声明了每个系统调用
Exception.cc
概述:对系统陷入进行解决。
从machine的2号寄存器读入系统调用号
执行对应的操作代码(需要自己完毕)
(如果需要)将返回值写回Machine的2号寄存器
Start.s
概述:当顾客程序执行一种系统调用的时候,将参数放入2号寄存器,然后跳转到exception.cc执行。以Halt为例:
将系统调用号放入2号寄存器
将系统调用号放入2号寄存器
总结
当顾客但愿执行一条系统调用的时候:
在顾客程序中调用
当这条语句被OneInstruction函数解析执行时,会判断出这是一条系统调用,转入start.s
在start.s中找到系统调用对应的入口(可能需要自己增加),将系统调用号放入machine的2号寄存器,并转入exception.cc
在exception.cc中,读出2号寄存器中的系统调用号,执行对应操作
必要时,将返回值写回2号寄存器,并注意,将PC迈进。
指令回到顾客程序系统调用的下一条继续执行。系统调用完毕。
为了执行一条系统调用,我们需要完毕的部分:
第一步:增加需要编译的文献名称。这两个是我新增的自己写一种用于测试的顾客程序的.c文献,并修改test的Makefile,使得顾客程序能够被Nachos系统执行。
第一步:增加需要编译的文献名称。这两个是我新增的
第二步,增加如何编译的信息。
第二步,增加如何编译的信息。
由于本次lab需要写的系统调用,在start.s中都已经写好了,因此我们不需要修改。同样,syscall.h中,系统调用号和函数声明也都写好了。(但如果但愿自己新增系统调用,这两个文献是需要修改的,修改方式能够参考别的系统调用)
补充exception.cc,执行对应的系统调用操作。
Exercise 2: 系统调用实现
任务:类比Halt的实现,完毕与文献系统有关的系统调用:Create, Open,Close,Write,Read。Syscall.h文献中有这些系统调用基本阐明。
Exercise 3: 编写顾客程序
任务:编写并运行顾客程序,调用 练习2中所写系统调用,测试其正误。
EX2+EX3完毕状况:
首先,在完毕了文献系统的lab之后,为了能够让userprog编译通过,需要修改system.h的makefile,多include几个头文献以及声明extern变量。否则,会出现:undefined reference *** 这种状况。
另首先,我们需要在exception.cc中,加入系统调用入口:
void Create(char *name)
概述:
从4号寄存器读入文献名指针
运用指针,从Machine的mainmemory(内存)中,读出文献名
用文献名为参数,调用filesystem的create函数,创立文献(默认长度256byte)
将PC前移:(machine.cc中定义)
代码:(从内存中读出文献名部分)
测试截图:
之后在userprog文献夹下,就出现了a.txt这个文献(由于我是用UNIX的文献系统来做这次lab的)
OpenFileId Open(char *name)
概述:
从4号寄存器读入文献名指针
运用指针,从Machine的mainmemory(内存)中,读出文献名
用文献名为参数,
文档评论(0)