nachos 系统调用编程实践

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值