6.S081 System calls
系统调用执行过程

系统调用添加步骤

System call tracing

sysproc.c
uint64
sys_trace(void)
{
int n;
if (argint(0, &n) < 0)
return -1;
myproc()->trace_mask = n;
return n;
}
proc.c
int fork(void)
{
...
np->trace_mask = p->trace_mask;
}
syscall.c
void syscall(void)
{
...
if (num > 0 && num < NELEM(syscalls) && syscalls[num])
{
p->tf->a0 = syscalls[num]();
if (p->trace_mask > 0 && (p->trace_mask & (1 << num)))
{
printf("%d : syscall %s -> %d\n", p->pid, syscall_names[num], p->tf->a0);
}
}
else
{
printf("%d %s: unknown sys call %d\n",
p->pid, p->name, num);
p->tf->a0 = -1;
}
}
user/trace.c
#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"
int main(int argc, char *argv[])
{
if (argc < 3 || argv[1][0] == '0')
{
printf("args error.\r\n");
exit(0);
}
if (trace(atoi(argv[1])) < 1)
{
printf("trace error.\r\n");
exit(0);
}
exec(argv[2], &argv[2]);
return 0;
}
Sysinfo

sysinfo.h
struct sysinfo
{
int num_freemem;
int num_unusedproc;
};
kalloc.c
int get_free_mem(void)
{
struct run *r;
acquire(&kmem.lock);
r = kmem.freelist;
int num = 0;
while (r)
{
num++;
r = r->next;
}
release(&kmem.lock);
return num * PGSIZE;
}
proc.c
int get_proc_unused(void)
{
struct proc *p;
int num = 0;
for (p = proc; p < &proc[NPROC]; p++)
{
acquire(&p->lock);
if (p->state == UNUSED)
{
num++;
}
release(&p->lock);
}
return num;
}
sysproc.c
uint64
sys_sysinfo(void)
{
struct sysinfo info;
uint64 addr;
if (argaddr(0, &addr) < 0)
{
return -1;
}
info.num_freemem = get_free_mem();
info.num_unusedproc = get_proc_unused();
if (copyout(myproc()->pagetable, addr, (char *)&info, sizeof(info)) < 0)
{
return -1;
}
return 0;
}
sysinfo.c
#include "kernel/types.h"
#include "kernel/stat.h"
#include "user/user.h"
#include "kernel/sysinfo.h"
int main(void)
{
struct sysinfo info;
if (sysinfo((char *)&info) < 0)
{
printf("sysinfo error.\r\n");
exit(0);
}
printf("free mem:%d\r\nunused process:%d\r\n", info.num_freemem, info.num_unusedproc);
exit(0);
}
浙公网安备 33010602011771号