📄 syscall.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 + -