1、本次shell实现的基础是前面已经完成的相关功能。注意到nachos已经实现简单的shell,我们只需要在此基础上进行相关的修改。任务完成情况任务完成列表(Y/N)ExerciseY具体Exercise的完成情况设计实现一个用户程序shell,通过./nachos -x shell进入用户交互界面中。在该界面中可以查询支持的功能、可以创建删除文件或目录、可以执行另一个用户程序并输出运行结果,类似Linux上跑的bash。你实现的越完善,碰到的问题越多,学到的也会越多。本实验所修改的代码包括内核和用户程序两部分。首先,需要解析输入的命令,这部分现有程序已经完成Write(prompt, 2, o
2、utput);Read(&bufferi, 1, input);因为在Lab6中,我没有考虑标准输入和标准输出的问题,所以需要修改exception.cc处理read系统调用和处理write系统调用的部分针对处理read系统调用的部分,如果系统调用的第3个参数是0(表示标准输入),那么读取从用户界面输入的字符串存入相应的位置if(fd = 0) for (int i = 0; i count; i+) contenti = getchar();针对处理write系统调用的部分,如果系统调用的第3个参数是1(表示标准输出),那么输出缓冲区字符串到用户界面if(fd = 1) for(int i
3、= 0; putchar(contenti);执行./nachos -x ./test/shell,shell启动 然后,确定需要实现的命令功能命令使用方法执行用户程序xx 用户程序显示当前路径pwd列出当前目录ls切换当前路径cdcd 路径创建文件nfnf 文件名创建文件夹ndnd 文件夹名删除文件dfdf 文件名删除文件夹dddd 文件夹名显示帮助信息h退出q部分指令的实现依赖已经实现的系统调用,部分指令的实现需要新的系统调用,添加系统调用的流程(1)syscall.h中定义系统调用接口、系统调用号;(2)start.s中添加链接代码;(3)exception.cc中增加系统调用的处理过程
4、. 执行用户程序 x基本思路是通过已经实现的系统调用Exec执行用户程序,通过已经实现的系统调用Join等待用户程序执行结束shell.cif (buffer0 = x & buffer1 = ) newProc = Exec(buffer + 2);Join(newProc);测试结果如下,用户程序正常执行显示当前路径 pwd基本思路是添加系统调用Pwd,基于C函数system实现显示当前路径syscall.h#define SC_Pwd 11void Pwd();start.sPwd: addiu $2,$0,SC_Pwd syscall j $31 .end Pwdexception.c
5、cpw buffer2 = d buffer3 = 0) Pwd();列出当前目录 ls基本思路是添加系统调用Ls,基于C函数system实现显示当前路径#define SC_Ls 12void Ls();Ls: addiu $2,$0,SC_Ls .end Lsls Ls();显示当期路径,列出当前目录,结果符合实际切换当前路径 cd基本思路是添加系统调用Cd,基于C函数chdir实现切换当前路径#define SC_Cd 13void Cd(char* name);Cd: addiu $2,$0,SC_Cd .end Cdc Cd(buffer + 3);首先切换到上级目录(.),然后切换
6、到目录test,结果符合实际创建文件nf基本思路是通过已经实现的系统调用Create创建文件nf Create(buffer + 3);删除文件 df基本思路是添加系统调用Remove,基于已经实现的Remove函数实现文件的删除,删除文件时使用添加的系统调用Remove#define SC_Remove 14void Remove(char* name);Remove: addiu $2,$0,SC_Remove .end Remove Remove(buffer + 3);在文件夹Lab7创建删除部分文件,结果符合实际 创建文件夹 nd基本思路是添加系统调用CreateDir,基于C函数m
7、kdir实现文件夹的建立#define SC_CreateDir 15void CreateDir(char* name);CreateDir: addiu $2,$0,SC_CreateDir .end CreateDir CreateDir(buffer + 3);删除文件夹 dd 基本思路是添加系统调用RemoveDir,基与C函数rmdir实现文件夹的删除#define SC_RemoveDir 16void RemoveDir(char* name);RemoveDir: addiu $2,$0,SC_RemoveDir .end RemoveDir RemoveDir(buffer
8、 + 3);在文件夹Lab7创建删除部分文件和文件夹,结果符合实际需要说明的是,如果使用C函数remove,可以利用统一的命令实现文件的删除和文件夹的删除,并且文件夹的删除是递归的。显示帮助信息h基本思路是添加系统调用Help,显示帮助信息#define SC_Help 17void Help();Help: addiu $2,$0,SC_Help .end HelphHelp();退出 q基本思路是通过已经实现的系统调用Exit退出shellq) Exit(0);测试结果如下,shell正常退出遇到的困难以及解决方法困难:通过C程序与Linux系统交互我选择使用Linux文件系统完成实习,n
9、achos已经实现的相关函数相对有限,其中文件/文件夹的建立和删除以及相关信息的查询实际上可以通过C的相关函数完成,当然,我们也可以使用nachos的文件系统完成实习,在这样的情况下,我们主要依靠Lab5文件系统实习和Lab6系统调用实习实现的相关函数收获及感想前面的实习顺利完成并且深入理解后,本次实习并不是特别困难,只需要实现shell用户程序并且添加部分系统调用即可对课程的意见和建议我觉得课程形式好,互动强,使我受益匪浅。助教认真负责,知识充分,为课程付出很多,助教辛苦了:-D参考文献1nachos中文教程2NachOS实验报告(4个全)3Nachos的shell实现4Nachos实验代码
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1