NachOS实验报告(4个全)(4)

2019-03-22 21:44

iii. iv. v. utility.c myshell.h readme

项目说明:可以通过调用Linux下的/bin/sh来实现该项目shell,主要是实现几个nachos系统调用:SysWrite,SysRead,SysExec,SysJoin,SysStrncmp 然后就是在exception.cc中调用这些系统调用 在shell中它们的作用:

? SysWrite: 显示提示符与shell的版本信息 ? SysRead:读取n个字符到缓存buffer

? SysExec 与SysJoin:主要是用来执行命令,如dir 等 。如果该命令不存在则打印错误信息

? SysStrncmp:比较两个字符串的前n个字符, 主要用来判断用户是否输入了exit命令以退出shell

Nachos中修改的地方: 1. syscall.h

添加了代码:#define SC_Strncmp 43

int Strncmp(char *buffer,char*str,int size); 2. Ksyscall 添加的代码: #include #include #include #include #include #include #include #include #include #include #include #include #include

#define SHELL \

int SysWrite(char*buffer ,int size,OpenFileId id) {

return write(id,buffer,(size_t)size); }

int SysRead(char*buffer ,int size,OpenFileId id) {

return read(id, buffer, (size_t) size); }

SpaceId SysExec(char* exec_name) {

pid_t child; child = vfork(); if(child == 0) {

execl (SHELL, SHELL, \ _exit (EXIT_FAILURE); }

else if(child < 0) return EPERM;

return (SpaceId) child; }

int SysJoin(SpaceId id) {

return waitpid((pid_t) id, (int*) 0, 0); }

int SysStrncmp(char*buffer,char *str,int n) {

return strncmp(buffer,str,(size_t)n); }

3. exception.cc case SC_Write:

DEBUG(dbgSys,\from buffer to consoleOutput\5)<machine->ReadRegister(6)<<\

char wbuffer[60];//the buffer to store information from userprogram int size ;

size=(int)kernel->machine->ReadRegister(5); OpenFileId printOut;

printOut= (OpenFileId)kernel->machine->ReadRegister(6); int addressOne;

addressOne=(int)kernel->machine->ReadRegister(4); int i; i=0; do{

kernel->machine->ReadMem(addressOne++,1,(int*)&wbuffer[i++]); }while(i

n1=SysWrite((char*)wbuffer,size,printOut); kernel->machine->WriteRegister(2,n1); /* Modify return point */ {

/* set previous programm counter (debugging only)*/ kernel->machine->WriteRegister(PrevPCReg, kernel->machine->ReadRegister(PCReg));

/* set programm counter to next instruction (all Instructions are 4 byte wide)*/

kernel->machine->WriteRegister(PCReg, kernel->machine->ReadRegister(PCReg) + 4);

/* set next programm counter for brach execution */ kernel->machine->WriteRegister(NextPCReg, kernel->machine->ReadRegister(PCReg)+4); } return;

ASSERTNOTREACHED(); break; case SC_Read:

DEBUG(dbgSys, \from buffer\<< kernel->machine->ReadRegister(4) << kernel->machine->ReadRegister(5)<< kernel->machine->ReadRegister(6) << \ int rsize ;

rsize=(int)kernel->machine->ReadRegister(5); OpenFileId enterIn;

enterIn = (OpenFileId)kernel->machine->ReadRegister(6); char addressTwo;

addressTwo = (char)kernel->machine->ReadRegister(4); int local ;

local= (int)kernel->machine->ReadRegister(4);; int n2 ;

n2= SysRead(&addressTwo,rsize,enterIn);

kernel->machine->WriteMem(local,1,(int)addressTwo); kernel->machine->WriteRegister(2,n2); /* Modify return point */

{ /* set previous programm counter (debugging only)*/ kernel->machine->WriteRegister(PrevPCReg, kernel->machine->ReadRegister(PCReg));

/* set programm counter to next instruction (all Instructions are 4 byte wide)*/

kernel->machine->WriteRegister(PCReg, kernel->machine->ReadRegister(PCReg) + 4);

/* set next programm counter for brach execution */ kernel->machine->WriteRegister(NextPCReg, kernel->machine->ReadRegister(PCReg)+4);

}

return;

ASSERTNOTREACHED(); break;

case SC_Exec:

DEBUG(dbgSys,\a command\ char ebuffer[60]; int addressThree;

addressThree = kernel->machine->ReadRegister(4); int c; c = 0; do{

kernel->machine->ReadMem(addressThree++,1,(int*)&ebuffer[c++]); }while(c<60);

kernel->machine->WriteRegister(2,SysExec(ebuffer)); /* Modify return point */

{/* set previous programm counter (debugging only)*/ kernel->machine->WriteRegister(PrevPCReg, kernel->machine->ReadRegister(PCReg));

/* set programm counter to next instruction (all Instructions are 4 byte wide)*/

kernel->machine->WriteRegister(PCReg, kernel->machine->ReadRegister(PCReg) + 4);

/* set next programm counter for brach execution */ kernel->machine->WriteRegister(NextPCReg, kernel->machine->ReadRegister(PCReg)+4); }

return;

ASSERTNOTREACHED(); break;

case SC_Join:

DEBUG(dbgSys,\

kernel->machine->WriteRegister(2,SysJoin((SpaceId)kernel->machine->ReadRegister(4)));

/* Modify return point */ {

/* set previous programm counter (debugging only)*/ kernel->machine->WriteRegister(PrevPCReg, kernel->machine->ReadRegister(PCReg));

/* set programm counter to next instruction (all Instructions are 4 byte wide)*/

kernel->machine->WriteRegister(PCReg, kernel->machine->ReadRegister(PCReg) + 4);

/* set next programm counter for brach execution */ kernel->machine->WriteRegister(NextPCReg, kernel->machine->ReadRegister(PCReg)+4); }

Return;

ASSERTNOTREACHED(); break;

case SC_Strncmp:

DEBUG(dbgSys, \two string \<< kernel->machine->ReadRegister(4) <machine->ReadRegister(5) << kernel->machine->ReadRegister(6) << \ int addressFour;

addressFour = kernel->machine->ReadRegister(4); int addressFive;

addressFive = kernel->machine->ReadRegister(5); char str1buffer[60]; char str2buffer[60]; int d,e; d= 0; e=0; do{

kernel->machine->ReadMem(addressFour++,1,(int*)&str1buffer[d++]); }while(d<60); --addressFour;

do{ kernel->machine->ReadMem(addressFive++,1,(int*)&str2buffer[e++]); }while(e<60); --addressFive; int n3;

n=SysStrncmp(str1buffer,str2buffer,kernel->machine->ReadRegister(6)); kernel->machine->WriteRegister(2,n3); /* Modify return point */

{/* set previous programm counter (debugging only)*/ kernel->machine->WriteRegister(PrevPCReg, kernel->machine->ReadRegister(PCReg));

/* set programm counter to next instruction (all Instructions are 4 byte wide)*/

kernel->machine->WriteRegister(PCReg, kernel->machine->ReadRegister(PCReg) + 4);

/* set next programm counter for brach execution */ kernel->machine->WriteRegister(NextPCReg, kernel->machine->ReadRegister(PCReg)+4); } return;

ASSERTNOTREACHED(); break;


NachOS实验报告(4个全)(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:《电子商务》2016年必修考试题目资料答案题库(最完全)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: