#include "types.h" #include "riscv.h" #include "defs.h" #include "param.h" #include "memlayout.h" #include "spinlock.h" #include "proc.h" #include "sysinfo.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; 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; } // 声明 kalloc.c 中的 freemem() 和 proc.c 中的 procinfo() extern uint64 freemem(void); extern void procinfo(uint64 *, uint64 *); uint64 sys_sysinfo(void) { uint64 user_sysinfo_addr; // 用户态传入的 struct sysinfo 指针(虚拟地址) struct sysinfo kinfo; // 内核态临时结构体(避免直接操作用户态内存) uint64 nproc, unused_proc_num; // 1. 读取用户态传入的第一个参数:struct sysinfo * 指针 argaddr(0, &user_sysinfo_addr); // 参数读取失败,返回错误 // 2. 收集系统信息 kinfo.freemem = freemem(); // 统计空闲内存 procinfo(&nproc, &unused_proc_num); // 统计进程数 kinfo.nproc = nproc; kinfo.unused_proc_num = unused_proc_num; // 3. 将内核态的 kinfo 复制到用户态地址(用户态指针指向的空间) // copyout 参数:进程页表、用户态目标地址、内核态源地址、复制字节数 if (copyout(myproc()->pagetable, user_sysinfo_addr,(char *)&kinfo, sizeof(kinfo)) < 0) { return -1; // 复制失败,返回错误 } return 0; // 成功返回 0 } uint64 sys_trace(void){ int n; argint(0, &n); struct proc *p = myproc(); char *mask = p->mask; int i = 0; while(i < 24 && n > 0){ if(n % 2){ mask[i++] = '1'; }else{ mask[i++] = '0'; } n >>= 1; } return 0; }