NachOS实验报告(4个全) 联系客服

发布时间 : 星期一 文章NachOS实验报告(4个全)更新完毕开始阅读6bdecb2ccfc789eb172dc8e0

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;