nachos Lab7实习报告Word文件下载.docx
《nachos Lab7实习报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《nachos Lab7实习报告Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
![nachos Lab7实习报告Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-12/29/25ee6ca9-6ded-48f0-b6dc-558bede6c0c2/25ee6ca9-6ded-48f0-b6dc-558bede6c0c21.gif)
本次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<
count;
i++)
content[i]=getchar();
}
针对处理write系统调用的部分,如果系统调用的第3个参数是1(表示标准输出),那么输出缓冲区字符串到用户界面
if(fd==1){
for(inti=0;
putchar(content[i]);
执行./nachos-x../test/shell,shell启动
然后,确定需要实现的命令
功能
命令
使用方法
执行用户程序
x
x用户程序
显示当前路径
pwd
列出当前目录
ls
切换当前路径
cd
cd路径
创建文件
nf
nf文件名
创建文件夹
nd
nd文件夹名
删除文件
df
df文件名
删除文件夹
dd
dd文件夹名
显示帮助信息
h
退出
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
p'
w'
buffer[2]=='
d'
buffer[3]=='
\0'
)
Pwd();
列出当前目录ls
基本思路是添加系统调用Ls,基于C函数system实现显示当前路径
#defineSC_Ls12
voidLs();
Ls:
addiu$2,$0,SC_Ls
.endLs
l'
s'
Ls();
显示当期路径,列出当前目录,结果符合实际
切换当前路径cd
基本思路是添加系统调用Cd,基于C函数chdir实现切换当前路径
#defineSC_Cd13
voidCd(char*name);
Cd:
addiu$2,$0,SC_Cd
.endCd
c'
Cd(buffer+3);
首先切换到上级目录(..),然后切换到目录test,结果符合实际
创建文件nf
基本思路是通过已经实现的系统调用Create创建文件
n'
f'
Create(buffer+3);
删除文件df
基本思路是添加系统调用Remove,基于已经实现的Remove函数实现文件的删除,删除文件时使用添加的系统调用Remove
#defineSC_Remove14
voidRemove(char*name);
Remove:
addiu$2,$0,SC_Remove
.endRemove
Remove(buffer+3);
在文件夹Lab7创建删除部分文件,结果符合实际
创建文件夹nd
基本思路是添加系统调用CreateDir,基于C函数mkdir实现文件夹的建立
#defineSC_CreateDir15
voidCreateDir(char*name);
CreateDir:
addiu$2,$0,SC_CreateDir
.endCreateDir
CreateDir(buffer+3);
删除文件夹dd
基本思路是添加系统调用RemoveDir,基与C函数rmdir实现文件夹的删除
#defineSC_RemoveDir16
voidRemoveDir(char*name);
RemoveDir:
addiu$2,$0,SC_RemoveDir
.endRemoveDir
RemoveDir(buffer+3);
在文件夹Lab7创建删除部分文件和文件夹,结果符合实际
需要说明的是,如果使用C函数remove,可以利用统一的命令实现文件的删除和文件夹的删除,并且文件夹的删除是递归的。
显示帮助信息h
基本思路是添加系统调用Help,显示帮助信息
#defineSC_Help17
voidHelp();
Help:
addiu$2,$0,SC_Help
.endHelp
h'
Help();
退出q
基本思路是通过已经实现的系统调用Exit退出shell
q'
)
Exit(0);
测试结果如下,shell正常退出
遇到的困难以及解决方法
困难:
通过C程序与Linux系统交互
我选择使用Linux文件系统完成实习,nachos已经实现的相关函数相对有限,其中文件/文件夹的建立和删除以及相关信息的查询实际上可以通过C的相关函数完成,当然,我们也可以使用nachos的文件系统完成实习,在这样的情况下,我们主要依靠Lab5文件系统实习和Lab6系统调用实习实现的相关函数
收获及感想
前面的实习顺利完成并且深入理解后,本次实习并不是特别困难,只需要实现shell用户程序并且添加部分系统调用即可
对课程的意见和建议
我觉得课程形式好,互动强,使我受益匪浅。
助教认真负责,知识充分,为课程付出很多,助教辛苦了:
-D
参考文献
[1]nachos中文教程
[2]
NachOS实验报告(4个全)
[3]
Nachos的shell实现
[4]
Nachos实验代码