#include "types.h" #include "riscv.h" #include "defs.h" #include "param.h" #include "memlayout.h" #include "spinlock.h" #include "proc.h" uint64 sys_exit(void) { int n; argint(0, &n); exit(n); return 0; // not reached } uint64 sys_getpid(void) { return myproc()->pid; } uint64 sys_fork(void) { return fork(); } uint64 sys_wait(void) { uint64 p; argaddr(0, &p); return wait(p); } uint64 sys_sbrk(void) { uint64 addr; int n; argint(0, &n); addr = myproc()->sz; if(growproc(n) < 0) return -1; return addr; } uint64 sys_sleep(void) { int n; uint ticks0; backtrace(); argint(0, &n); if(n < 0) n = 0; acquire(&tickslock); ticks0 = ticks; while(ticks - ticks0 < n){ if(killed(myproc())){ release(&tickslock); return -1; } sleep(&ticks, &tickslock); } release(&tickslock); return 0; } uint64 sys_kill(void) { int pid; argint(0, &pid); return kill(pid); } // return how many clock tick interrupts have occurred // since start. uint64 sys_uptime(void) { uint xticks; acquire(&tickslock); xticks = ticks; release(&tickslock); return xticks; } // sys_sigalarm函数用于设置进程的定时信号处理机制。 // 参数: // alarm_cnt:定时器计数值,表示每经过alarm_cnt个时钟中断后触发一次信号处理。 // addr:信号处理函数的用户空间地址。 // 实现: // 1. 通过argint和argaddr获取用户传入的参数。 // 2. 将进程的inter_cnt(中断计数器)清零。 // 3. 保存信号处理函数地址和定时器计数值到进程结构体。 // 4. 返回0,表示设置成功。 // sys_sigreturn函数用于在信号处理函数执行完毕后恢复进程的上下文。 // 实现: // 1. 获取当前进程指针。 // 2. 将trapframe恢复为信号处理前保存的pre_trapframe,恢复进程上下文。 // 3. 将inter_cnt(中断计数器)清零,重新计数。 // 4. 返回信号处理前a0寄存器的值,作为系统调用的返回值。 uint64 sys_sigalarm(void) { int alarm_cnt; uint64 addr; struct proc *p = myproc(); argint(0, &alarm_cnt); argaddr(1, &addr); p->inter_cnt = 0; p->handler = addr; p->alarm_cnt = alarm_cnt; return 0; } uint64 sys_sigreturn(void) { struct proc* p = myproc(); *p->trapframe = *p->pre_trapframe; p->inter_cnt = 0; return p->pre_trapframe->a0; }