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

📄 syscall.c

📁 美国mit操作系统课程所用的一个教学操作系统xv6
💻 C
字号:
#include "types.h"#include "defs.h"#include "param.h"#include "mmu.h"#include "proc.h"#include "x86.h"#include "syscall.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 *s, *ep;  if(addr >= p->sz)    return -1;  *pp = p->mem + addr;  ep = p->mem + p->sz;  for(s = *pp; s < ep; s++)    if(*s == 0)      return s - *pp;  return -1;}// Fetch the nth 32-bit system call argument.intargint(int n, int *ip){  return fetchint(cp, cp->tf->esp + 4 + 4*n, 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 n, char **pp, int size){  int i;    if(argint(n, &i) < 0)    return -1;  if((uint)i >= cp->sz || (uint)i+size >= cp->sz)    return -1;  *pp = cp->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 n, char **pp){  int addr;  if(argint(n, &addr) < 0)    return -1;  return fetchstr(cp, 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_sleep(void);extern int sys_unlink(void);extern int sys_wait(void);extern int sys_write(void);static int (*syscalls[])(void) = {[SYS_chdir]   sys_chdir,[SYS_close]   sys_close,[SYS_dup]     sys_dup,[SYS_exec]    sys_exec,[SYS_exit]    sys_exit,[SYS_fork]    sys_fork,[SYS_fstat]   sys_fstat,[SYS_getpid]  sys_getpid,[SYS_kill]    sys_kill,[SYS_link]    sys_link,[SYS_mkdir]   sys_mkdir,[SYS_mknod]   sys_mknod,[SYS_open]    sys_open,[SYS_pipe]    sys_pipe,[SYS_read]    sys_read,[SYS_sbrk]    sys_sbrk,[SYS_sleep]   sys_sleep,[SYS_unlink]  sys_unlink,[SYS_wait]    sys_wait,[SYS_write]   sys_write,};voidsyscall(void){  int num;    num = cp->tf->eax;  if(num >= 0 && num < NELEM(syscalls) && syscalls[num])    cp->tf->eax = syscalls[num]();  else {    cprintf("%d %s: unknown sys call %d\n",            cp->pid, cp->name, num);    cp->tf->eax = -1;  }}

⌨️ 快捷键说明

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