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

📄 syscall.c

📁 类unix x86平台的简单操作系统
💻 C
字号:
#include "types.h"#include "stat.h"#include "param.h"#include "mmu.h"#include "proc.h"#include "defs.h"#include "x86.h"#include "traps.h"#include "syscall.h"#include "spinlock.h"#include "buf.h"#include "fs.h"#include "fsvar.h"#include "elf.h"#include "file.h"#include "fcntl.h"// User code makes a system call with INT T_SYSCALL.// System call number in %eax.// Arguments on the stack, from the user call to the C// library system call function. The saved user %esp points// to a saved program counter, and then the first argument.// Fetch the int at addr from process p.intfetchint(struct proc *p, uint addr, int *ip){  if(addr >= p->sz || addr+4 > p->sz)    return -1;  *ip = *(int*)(p->mem + addr);  return 0;}// Fetch the nul-terminated string at addr from process p.// Doesn't actually copy the string - just sets *pp to point at it.// Returns length of string, not including nul.intfetchstr(struct proc *p, uint addr, char **pp){  char *cp, *ep;  if(addr >= p->sz)    return -1;  *pp = p->mem + addr;  ep = p->mem + p->sz;  for(cp = *pp; cp < ep; cp++)    if(*cp == 0)      return cp - *pp;  return -1;}// Fetch the argno'th word-sized system call argument as an integer.intargint(int argno, int *ip){  struct proc *p = curproc[cpu()];  return fetchint(p, p->tf->esp + 4 + 4*argno, ip);}// Fetch the nth word-sized system call argument as a pointer// to a block of memory of size n bytes.  Check that the pointer// lies within the process address space.intargptr(int argno, char **pp, int size){  int i;  struct proc *p = curproc[cpu()];    if(argint(argno, &i) < 0)    return -1;  if((uint)i >= p->sz || (uint)i+size >= p->sz)    return -1;  *pp = p->mem + i;  return 0;}// Fetch the nth word-sized system call argument as a string pointer.// Check that the pointer is valid and the string is nul-terminated.// (There is no shared writable memory, so the string can't change// between this check and being used by the kernel.)intargstr(int argno, char **pp){  int addr;  if(argint(argno, &addr) < 0)    return -1;  return fetchstr(curproc[cpu()], addr, pp);}extern int sys_chdir(void);extern int sys_close(void);extern int sys_dup(void);extern int sys_exec(void);extern int sys_exit(void);extern int sys_fork(void);extern int sys_fstat(void);extern int sys_getpid(void);extern int sys_kill(void);extern int sys_link(void);extern int sys_mkdir(void);extern int sys_mknod(void);extern int sys_open(void);extern int sys_pipe(void);extern int sys_read(void);extern int sys_sbrk(void);extern int sys_unlink(void);extern int sys_wait(void);extern int sys_write(void);voidsyscall(void){  struct proc *cp = curproc[cpu()];  int num = cp->tf->eax;  int ret = -1;  switch(num){  case SYS_fork:    ret = sys_fork();    break;  case SYS_exit:    ret = sys_exit();    break;  case SYS_wait:    ret = sys_wait();    break;  case SYS_pipe:    ret = sys_pipe();    break;  case SYS_write:    ret = sys_write();    break;  case SYS_read:    ret = sys_read();    break;  case SYS_close:    ret = sys_close();    break;  case SYS_kill:    ret = sys_kill();    break;  case SYS_exec:    ret = sys_exec();    break;  case SYS_open:    ret = sys_open();    break;  case SYS_mknod:    ret = sys_mknod();    break;  case SYS_unlink:    ret = sys_unlink();    break;  case SYS_fstat:    ret = sys_fstat();    break;  case SYS_link:    ret = sys_link();    break;  case SYS_mkdir:    ret = sys_mkdir();    break;  case SYS_chdir:    ret = sys_chdir();    break;  case SYS_dup:    ret = sys_dup();    break;  case SYS_getpid:    ret = sys_getpid();    break;  case SYS_sbrk:    ret = sys_sbrk();    break;  default:    cprintf("unknown sys call %d\n", num);    // Maybe kill the process?    break;  }  cp->tf->eax = ret;}

⌨️ 快捷键说明

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