您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > nachos Lab7实习报告
shell实现实习报告2目录内容一:总体概述.........................................................3内容二:任务完成情况.....................................................3任务完成列表(Y/N)..................................................3具体Exercise的完成情况..............................................3内容三:遇到的困难以及解决方法..........................................13内容四:收获及感想......................................................13内容五:对课程的意见和建议..............................................13内容六:参考文献........................................................133内容一:总体概述本次实习需要实现用户程序shell。shell是提供使用者使用界面的软件(命令解析器),他接收用户命令,然后调用相应的应用程序。本次shell实现的基础是前面已经完成的相关功能。注意到nachos已经实现简单的shell,我们只需要在此基础上进行相关的修改。内容二:任务完成情况任务完成列表(Y/N)ExerciseY具体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;icount;i++)content[i]=getchar();}针对处理write系统调用的部分,如果系统调用的第3个参数是1(表示标准输出),那么输出缓冲区字符串到用户界面4if(fd==1){for(inti=0;icount;i++)putchar(content[i]);}执行./nachos-x../test/shell,shell启动然后,确定需要实现的命令功能命令使用方法执行用户程序xx用户程序显示当前路径pwdpwd列出当前目录lsls切换当前路径cdcd路径创建文件nfnf文件名创建文件夹ndnd文件夹名删除文件dfdf文件名删除文件夹dddd文件夹名显示帮助信息hh退出qq部分指令的实现依赖已经实现的系统调用,部分指令的实现需要新的系统调用,添加系统调用的流程(1)syscall.h中定义系统调用接口、系统调用号;(2)start.s中添加链接代码;(3)exception.cc中增加系统调用的处理过程.执行用户程序x基本思路是通过已经实现的系统调用Exec执行用户程序,通过已经实现的系统调用Join等待用户程序执行结束5shell.cif(buffer[0]=='x'&&buffer[1]==''){newProc=Exec(buffer+2);Join(newProc);}测试结果如下,用户程序正常执行显示当前路径pwd基本思路是添加系统调用Pwd,基于C函数system实现显示当前路径syscall.h#defineSC_Pwd11voidPwd();start.sPwd:addiu$2,$0,SC_Pwdsyscallj$31.endPwdexception.cc6shell.cif(buffer[0]=='p'&&buffer[1]=='w'&&buffer[2]=='d'&&buffer[3]=='\0')Pwd();列出当前目录ls基本思路是添加系统调用Ls,基于C函数system实现显示当前路径syscall.h#defineSC_Ls12voidLs();start.sLs:addiu$2,$0,SC_Lssyscallj$31.endLsexception.ccshell.cif(buffer[0]=='l'&&buffer[1]=='s'&&buffer[2]=='\0')Ls();显示当期路径,列出当前目录,结果符合实际切换当前路径cd7基本思路是添加系统调用Cd,基于C函数chdir实现切换当前路径syscall.h#defineSC_Cd13voidCd(char*name);start.sCd:addiu$2,$0,SC_Cdsyscallj$31.endCdexception.ccshell.cif(buffer[0]=='c'&&buffer[1]=='d'&&buffer[2]=='')Cd(buffer+3);首先切换到上级目录(..),然后切换到目录test,结果符合实际创建文件nf基本思路是通过已经实现的系统调用Create创建文件shell.c8if(buffer[0]=='n'&&buffer[1]=='f'&&buffer[2]=='')Create(buffer+3);删除文件df基本思路是添加系统调用Remove,基于已经实现的Remove函数实现文件的删除,删除文件时使用添加的系统调用Removesyscall.h#defineSC_Remove14voidRemove(char*name);start.sRemove:addiu$2,$0,SC_Removesyscallj$31.endRemoveexception.ccshell.cif(buffer[0]=='d'&&buffer[1]=='f'&&buffer[2]=='')Remove(buffer+3);在文件夹Lab7创建删除部分文件,结果符合实际9创建文件夹nd基本思路是添加系统调用CreateDir,基于C函数mkdir实现文件夹的建立syscall.h#defineSC_CreateDir15voidCreateDir(char*name);start.sCreateDir:addiu$2,$0,SC_CreateDirsyscallj$31.endCreateDirexception.ccshell.cif(buffer[0]=='n'&&buffer[1]=='d'&&buffer[2]=='')CreateDir(buffer+3);删除文件夹dd基本思路是添加系统调用RemoveDir,基与C函数rmdir实现文件夹的删除10syscall.h#defineSC_RemoveDir16voidRemoveDir(char*name);start.sRemoveDir:addiu$2,$0,SC_RemoveDirsyscallj$31.endRemoveDirexception.ccshell.cif(buffer[0]=='d'&&buffer[1]=='d'&&buffer[2]=='')RemoveDir(buffer+3);在文件夹Lab7创建删除部分文件和文件夹,结果符合实际11需要说明的是,如果使用C函数remove,可以利用统一的命令实现文件的删除和文件夹的删除,并且文件夹的删除是递归的。显示帮助信息h基本思路是添加系统调用Help,显示帮助信息syscall.h#defineSC_Help17voidHelp();start.sHelp:addiu$2,$0,SC_Helpsyscallj$31.endHelpexception.cc12shell.cif(buffer[0]=='h'&&buffer[1]=='\0')Help();退出q基本思路是通过已经实现的系统调用Exit退出shellshell.cif(buffer[0]=='q'&&buffer[1]=='\0')Exit(0);测试结果如下,shell正常退出13内容三:遇到的困难以及解决方法困难:通过C程序与Linux系统交互我选择使用Linux文件系统完成实习,nachos已经实现的相关函数相对有限,其中文件/文件夹的建立和删除以及相关信息的查询实际上可以通过C的相关函数完成,当然,我们也可以使用nachos的文件系统完成实习,在这样的情况下,我们主要依靠Lab5文件系统实习和Lab6系统调用实习实现的相关函数内容四:收获及感想前面的实习顺利完成并且深入理解后,本次实习并不是特别困难,只需要实现shell用户程序并且添加部分系统调用即可内容五:对课程的意见和建议我觉得课程形式好,互动强,使我受益匪浅。我觉得课程形式好,互动强,使我受益匪浅。助教认真负责,知识充分,为课程付出很多,助教辛苦了:-D14内容六:参考文献[1]nachos中文教程[2]=dAr-aQbEqxMa5LxIThF_TJIt8_QMtNFqTbePYaPWycL9qewQMFBBf1i0r0EA6h4bVPHDBDv9lgBqjlqLWvWgrdbr3xCTdkH3Y09b2gOJFFSNachOS实验报告(4个全)[3]=E-bRsoJhMhEwKZaXkXZmYL1j1BIeDq0d8JZ9Rf0GvZt9jQdC8SFoiR1-B0d8tGylBvixFzbodT9kp88zL0eXK1okPZjPjAwbkEGDiwPi7ruNachos的shell实现[4]实验代码
本文标题:nachos Lab7实习报告
链接地址:https://www.777doc.com/doc-5100473 .html