⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 system.c

📁 nachos test nachos 有关实验
💻 C
字号:
/* Copyright (c) 1992-1993 The Regents of the University of California. All rights reserved.  See copyright.h for copyright notice and limitation  of liability and disclaimer of warranty provisions. */#include "copyright.h"#include <stdio.h>#include <syscall.h>#include "int.h"extern int Reg[];extern char mem[];extern int Traptrace;char *u_to_int_addr();/* handle system calls */system_break(){	if  ( Traptrace )		printf("**breakpoint ");	system_trap();}system_trap(){	int o0, o1, o2;		/* user out register values */	int syscallno;	extern long lseek();	if  ( Traptrace )	{		printf("**System call %d\n", Reg[2]);		dump_reg();	}/*	if (Reg[1] == 0)/*	{			/* SYS_indir *//*		syscallno = Reg[8];	/* out reg 0 *//*		o0 = Reg[9];/*		o1 = Reg[10];/*		o2 = Reg[11];/*	}/*	else	/* */	{		syscallno = Reg[2];		o0 = Reg[4];		o1 = Reg[5];		o2 = Reg[6];	}	switch (syscallno)	{		case SYS_exit:	/*1*/			printstatistics();			fflush(stdout);			exit(0);			break;		case SYS_read:	/*3*/			Reg[1] = 				read(u_to_int_fd(o0), u_to_int_addr(o1), o2);			break;		case SYS_write:	/*4*/			Reg[1] = 				write(u_to_int_fd(o0), u_to_int_addr(o1), o2);			break;		case SYS_open:	/*5*/			Reg[1] = open(u_to_int_addr(o0), o1, o2); /* */			break;		case SYS_close:	/*6*/			Reg[1] = 0;	/* hack */			break;		case 17:	/* 17 */			/* old sbreak. where did it go? */			Reg[1] = ((o0 / 8192) + 1) * 8192;			break;		case SYS_lseek:	/*19*/			Reg[1] = (int) lseek(u_to_int_fd(o0), (long) o1, o2);			break;		case SYS_ioctl:/* 54 */			{	/* copied from sas -- I don't understand yet. */				/* see dave weaver */#define	IOCPARM_MASK	0x7f	/* parameters must be < 128 bytes */				int size = (o1 >> 16) & IOCPARM_MASK;				char ioctl_group = (o1 >> 8) & 0x00ff;				if ((ioctl_group == 't') && (size == 8))				{					size = 6;					o1 = (o1 & ~((IOCPARM_MASK << 16))) 					   | (size << 16);				}			}			Reg[1] = ioctl(u_to_int_fd(o0),o1,u_to_int_addr(o2));			Reg[1] = 0;	/* hack */			break;		case SYS_fstat:		/* 62 */			Reg[1] = fstat(o1, o2);			break;		case SYS_getpagesize:	/* 64 */			Reg[1] = getpagesize();			break;		default:			printf("Unknown System call %d\n", syscallno);			if  ( ! Traptrace )				dump_reg();			exit(2);			break;	}	if  ( Traptrace )	{		printf("**Afterwards:\n");		dump_reg();	}}char *u_to_int_addr(ptr)int ptr;{	/* convert a user pointer to the real address   */	/* used in the interpreter			*/	 return ((char *) ((int) mem - memoffset  + ptr));}u_to_int_fd(fd){	if (fd > 2)	{		/*		printf("No general file descriptors yet\n");		exit(2);		*/	}	return (fd);		/* assume we can handle it for now */}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -