You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
os-xv6/kernel/sysproc.c

148 lines
2.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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;
}