nachos Lab7实习报告.docx

上传人:b****1 文档编号:14386191 上传时间:2023-06-23 格式:DOCX 页数:13 大小:311.83KB
下载 相关 举报
nachos Lab7实习报告.docx_第1页
第1页 / 共13页
nachos Lab7实习报告.docx_第2页
第2页 / 共13页
nachos Lab7实习报告.docx_第3页
第3页 / 共13页
nachos Lab7实习报告.docx_第4页
第4页 / 共13页
nachos Lab7实习报告.docx_第5页
第5页 / 共13页
nachos Lab7实习报告.docx_第6页
第6页 / 共13页
nachos Lab7实习报告.docx_第7页
第7页 / 共13页
nachos Lab7实习报告.docx_第8页
第8页 / 共13页
nachos Lab7实习报告.docx_第9页
第9页 / 共13页
nachos Lab7实习报告.docx_第10页
第10页 / 共13页
nachos Lab7实习报告.docx_第11页
第11页 / 共13页
nachos Lab7实习报告.docx_第12页
第12页 / 共13页
nachos Lab7实习报告.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

nachos Lab7实习报告.docx

《nachos Lab7实习报告.docx》由会员分享,可在线阅读,更多相关《nachos Lab7实习报告.docx(13页珍藏版)》请在冰点文库上搜索。

nachos Lab7实习报告.docx

nachosLab7实习报告

shell实现实习报告

 

内容一:

总体概述

本次实习需要实现用户程序shell。

shell是提供使用者使用界面的软件(命令解析器),他接收用户命令,然后调用相应的应用程序。

本次shell实现的基础是前面已经完成的相关功能。

注意到nachos已经实现简单的shell,我们只需要在此基础上进行相关的修改。

内容二:

任务完成情况

任务完成列表(Y/N)

Exercise

Y

具体Exercise的完成情况

设计实现一个用户程序shell,通过./nachos-xshell进入用户交互界面中。

在该界面中可以查询支持的功能、可以创建删除文件或目录、可以执行另一个用户程序并输出运行结果,类似Linux上跑的bash。

你实现的越完善,碰到的问题越多,学到的也会越多。

本实验所修改的代码包括内核和用户程序两部分。

首先,需要解析输入的命令,这部分现有程序已经完成

Write(prompt,2,output);

Read(&buffer[i],1,input);

因为在Lab6中,我没有考虑标准输入和标准输出的问题,所以需要修改exception.cc处理read系统调用和处理write系统调用的部分

针对处理read系统调用的部分,如果系统调用的第3个参数是0(表示标准输入),那么读取从用户界面输入的字符串存入相应的位置

if(fd==0){

for(inti=0;i

content[i]=getchar();

}

针对处理write系统调用的部分,如果系统调用的第3个参数是1(表示标准输出),那么输出缓冲区字符串到用户界面

if(fd==1){

for(inti=0;i

putchar(content[i]);

}

执行./nachos-x../test/shell,shell启动

然后,确定需要实现的命令

功能

命令

使用方法

执行用户程序

x

x用户程序

显示当前路径

pwd

pwd

列出当前目录

ls

ls

切换当前路径

cd

cd路径

创建文件

nf

nf文件名

创建文件夹

nd

nd文件夹名

删除文件

df

df文件名

删除文件夹

dd

dd文件夹名

显示帮助信息

h

h

退出

q

q

部分指令的实现依赖已经实现的系统调用,部分指令的实现需要新的系统调用,添加系统调用的流程

(1)syscall.h中定义系统调用接口、系统调用号;

(2)start.s中添加链接代码;

(3)exception.cc中增加系统调用的处理过程.

执行用户程序x

基本思路是通过已经实现的系统调用Exec执行用户程序,通过已经实现的系统调用Join等待用户程序执行结束

shell.c

if(buffer[0]=='x'&&buffer[1]==''){

newProc=Exec(buffer+2);

Join(newProc);

}

测试结果如下,用户程序正常执行

显示当前路径pwd

基本思路是添加系统调用Pwd,基于C函数system实现显示当前路径

syscall.h

#defineSC_Pwd11

voidPwd();

start.s

Pwd:

addiu$2,$0,SC_Pwd

syscall

j$31

.endPwd

exception.cc

shell.c

if(buffer[0]=='p'&&buffer[1]=='w'&&buffer[2]=='d'

&&buffer[3]=='\0')

Pwd();

列出当前目录ls

基本思路是添加系统调用Ls,基于C函数system实现显示当前路径

syscall.h

#defineSC_Ls12

voidLs();

start.s

Ls:

addiu$2,$0,SC_Ls

syscall

j$31

.endLs

exception.cc

shell.c

if(buffer[0]=='l'&&buffer[1]=='s'&&buffer[2]=='\0')

Ls();

显示当期路径,列出当前目录,结果符合实际

切换当前路径cd

基本思路是添加系统调用Cd,基于C函数chdir实现切换当前路径

syscall.h

#defineSC_Cd13

voidCd(char*name);

start.s

Cd:

addiu$2,$0,SC_Cd

syscall

j$31

.endCd

exception.cc

shell.c

if(buffer[0]=='c'&&buffer[1]=='d'&&buffer[2]=='')

Cd(buffer+3);

首先切换到上级目录(..),然后切换到目录test,结果符合实际

创建文件nf

基本思路是通过已经实现的系统调用Create创建文件

shell.c

if(buffer[0]=='n'&&buffer[1]=='f'&&buffer[2]=='')

Create(buffer+3);

删除文件df

基本思路是添加系统调用Remove,基于已经实现的Remove函数实现文件的删除,删除文件时使用添加的系统调用Remove

syscall.h

#defineSC_Remove14

voidRemove(char*name);

start.s

Remove:

addiu$2,$0,SC_Remove

syscall

j$31

.endRemove

exception.cc

shell.c

if(buffer[0]=='d'&&buffer[1]=='f'&&buffer[2]=='')

Remove(buffer+3);

在文件夹Lab7创建删除部分文件,结果符合实际

创建文件夹nd

基本思路是添加系统调用CreateDir,基于C函数mkdir实现文件夹的建立

syscall.h

#defineSC_CreateDir15

voidCreateDir(char*name);

start.s

CreateDir:

addiu$2,$0,SC_CreateDir

syscall

j$31

.endCreateDir

exception.cc

shell.c

if(buffer[0]=='n'&&buffer[1]=='d'&&buffer[2]=='')

CreateDir(buffer+3);

删除文件夹dd

基本思路是添加系统调用RemoveDir,基与C函数rmdir实现文件夹的删除

syscall.h

#defineSC_RemoveDir16

voidRemoveDir(char*name);

start.s

RemoveDir:

addiu$2,$0,SC_RemoveDir

syscall

j$31

.endRemoveDir

exception.cc

shell.c

if(buffer[0]=='d'&&buffer[1]=='d'&&buffer[2]=='')

RemoveDir(buffer+3);

在文件夹Lab7创建删除部分文件和文件夹,结果符合实际

需要说明的是,如果使用C函数remove,可以利用统一的命令实现文件的删除和文件夹的删除,并且文件夹的删除是递归的。

显示帮助信息h

基本思路是添加系统调用Help,显示帮助信息

syscall.h

#defineSC_Help17

voidHelp();

start.s

Help:

addiu$2,$0,SC_Help

syscall

j$31

.endHelp

exception.cc

shell.c

if(buffer[0]=='h'&&buffer[1]=='\0')

Help();

退出q

基本思路是通过已经实现的系统调用Exit退出shell

shell.c

if(buffer[0]=='q'&&buffer[1]=='\0')

Exit(0);

测试结果如下,shell正常退出

内容三:

遇到的困难以及解决方法

困难:

通过C程序与Linux系统交互

我选择使用Linux文件系统完成实习,nachos已经实现的相关函数相对有限,其中文件/文件夹的建立和删除以及相关信息的查询实际上可以通过C的相关函数完成,当然,我们也可以使用nachos的文件系统完成实习,在这样的情况下,我们主要依靠Lab5文件系统实习和Lab6系统调用实习实现的相关函数

内容四:

收获及感想

前面的实习顺利完成并且深入理解后,本次实习并不是特别困难,只需要实现shell用户程序并且添加部分系统调用即可

内容五:

对课程的意见和建议

我觉得课程形式好,互动强,使我受益匪浅。

我觉得课程形式好,互动强,使我受益匪浅。

助教认真负责,知识充分,为课程付出很多,助教辛苦了:

-D

内容六:

参考文献

[1]nachos中文教程

[2]

NachOS实验报告(4个全)

[3]

Nachos的shell实现

[4]

Nachos实验代码

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > PPT模板 > 节日庆典

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2