mit-6s081-lab02-System_call_tracing
声明
文章仅具有解释意义
希望能为你搭建知识框架
过程
Makefile Modification:
makefile
UPROGS=
…
$U/_trace
User Space Modifications:
user/user.h:
int trace(int);
user/usys.pl:
entry("trace");
Kernel Modifications:
kernel/syscall.h:
#define SYS_trace 22
kernel/syscall.c:
extern uint64 sys_trace(void);
//这里是自己添加不是将syscalls修改
static char *syscall_names[] = {
[SYS_fork] "fork",
[SYS_exit] "exit",
[SYS_wait] "wait",
[SYS_pipe] "pipe",
[SYS_read] "read",
[SYS_kill] "kill",
[SYS_exec] "exec",
[SYS_fstat] "fstat",
[SYS_chdir] "chdir",
[SYS_dup] "dup",
[SYS_getpid] "getpid",
[SYS_sbrk] "sbrk",
[SYS_sleep] "sleep",
[SYS_uptime] "uptime",
[SYS_open] "open",
[SYS_write] "write",
[SYS_mknod] "mknod",
[SYS_unlink] "unlink",
[SYS_link] "link",
[SYS_mkdir] "mkdir",
[SYS_close] "close",
[SYS_trace] "trace",
};
kernel/sysproc.c:
uint64 sys_trace(void) {
int mask;
if (argint(0, &mask) < 0)
return -1;
struct proc *p = myproc();
p->trace_mask = mask;
return 0;
}
kernel/proc.h:
struct proc {
...
int trace_mask;
...
};
kernel/proc.c (fork and allocproc):
int fork(void) {
...
np->trace_mask = p->trace_mask;
...
}
static struct proc* allocproc(void) {
...
p->trace_mask = 0;
...
}
kernel/syscall.c (syscall function):
void syscall(void) {
int num;
struct proc *p = myproc();
num = p->trapframe->a7;
if (num > 0 && num < NELEM(syscalls) && syscalls[num]) {
p->trapframe->a0 = syscalls[num]();
if ((p->trace_mask & (1 << num)) != 0) {
char *name = "unknown";
if (num < NELEM(syscall_names) && syscall_names[num] != 0) {
name = syscall_names[num];
}
printf("%d: syscall %s -> %d\n", p->pid, name, p->trapframe->a0);
}
} else {
printf("%d %s: unknown sys call %d\n", p->pid, p->name, num);
p->trapframe->a0 = -1;
}
}