nachos系统调用的实现
cd Nachos-4.1/code/test
vim start.s
.globl Halt
.ent Halt
Halt:
addiu $2,$0,SC_Halt //将SC_Halt与$0寄存器($0寄存器恒为0)内容相加,并存放到寄存器$2,获取中断号,唯一标志一个系统调用
syscall //调用SC_Halt
j $31 //无条件跳转到$31(存放程序的返回地址)
.end Halt
修改syscall
cd Nachos-4.1/code/usrprogr
vim syscall.h
#define SC_Add 42
#define SC_Sub 43
#define SC_Mul 44
#define SC_Pow 45
vim exception.cc
case SC_Add:
DEBUG(dbgSys, "Add " << kernel->machine->ReadRegister(4) << " + " << kernel->machine->ReadRegister(5) << "\n");
/* Process SysAdd Systemcall*/
int result;//4,5寄存器相加
result = SysAdd(/* int op1 */(int)kernel->machine->ReadRegister(4),
/* int op2 */(int)kernel->machine->ReadRegister(5));
//输出调试信息
DEBUG(dbgSys, "Add returning with " << result << "\n");
/* Prepare Result */
kernel->machine->WriteRegister(2, (int)result);//结果保存到到2号寄存器
/* Modify return point *///对PC的值进行设置
{
/* 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;
vim ksyscall.h
int SysAdd(int op1, int op2)
{
return op1 + op2;
}
int SysSub(int op1, int op2)
{
return op1 - op2;
}
int SysMul(int op1, int op2)
{
return op1 + op2;
}
int SyspPow(int op1, int op2)
{
int result;
int count;
result =1;
count=op2;
int i=0;
for (i = 0; i < count; i++)
{
result=SysMul(op1,result);
}
return result;
}
编译:
cd build.linux
make clean
make
cd /test
vim Mkefile
make clean
Make
./nachos -x test.noff -d u
修改
SOURCES = add.c halt.c matmult.c shell.c sort.c test.c