作业原地址:https://pdos.csail.mit.edu/6.828/2016/homework/xv6-syscall.html
第一部分:跟踪system call运行
修改syscall.c中syscall()函数,增加打印信息
void
syscall(void)
{
int num;
num = proc->tf->eax;
if(num > 0 && num < NELEM(syscalls) && syscalls[num]) {
proc->tf->eax = syscalls[num]();
switch (num) {
case SYS_fork:
cprintf("fork -> ");
break;
case SYS_exit:
cprintf("exit -> ");
break;
case SYS_wait:
cprintf("wait -> ");
break;
case SYS_pipe:
cprintf("pipe -> ");
break;
case SYS_read:
cprintf("read -> ");
break;
case SYS_kill:
cprintf("kill -> ");
break;
case SYS_exec:
cprintf("exec -> ");
break;
case SYS_fstat:
cprintf("fstat -> ");
break;
case SYS_chdir:
cprintf("chdir -> ");
break;
case SYS_dup:
cprintf("dup -> ");
break;
case SYS_getpid:
cprintf("getpid -> ");
break;
case SYS_sbrk:
cprintf("sbrk -> ");
break;
case SYS_sleep:
cprintf("sleep -> ");
break;
case SYS_uptime:
cprintf("uptime -> ");
break;
case SYS_open:
cprintf("open -> ");
break;
case SYS_write:
cprintf("write -> ");
break;
case SYS_mknod:
cprintf("mknod -> ");
break;
case SYS_unlink:
cprintf("unlink -> ");
break;
case SYS_link:
cprintf("link -> ");
break;
case SYS_mkdir:
cprintf("mkdir -> ");
break;
case SYS_close:
cprintf("close -> ");
break;
default:
panic("should never get here\n");
}
cprintf("%d\n", proc->tf->eax);
} else {
cprintf("%d %s: unknown sys call %d\n",
proc->pid, proc->name, num);
proc->tf->eax = -1;
}
}
第二部分:为xv6增加一个新的系统调用date(),并创建一个用户程序使用这个系统调用。
第一步:通过查找一个现有的系统调用,找到一个系统调用所涉及到的所有文件,并把新的系统调用加入。
例如,通过查找系统调用uptime()
grep -n uptime *.[chS]
可以得到以下信息:
syscall.c:100:extern int sys_uptime(void);
syscall.c:100:extern int sys_uptime(void);
syscall.c:116:[SYS_uptime] sys_uptime,
syscall.h:15:#define SYS_uptime 14
sysproc.c:83:sys_uptime(void)
user.h:25:int uptime(void);
usys.S:31:SYSCALL(uptime)
由此可知,一个系统调用涉及到syscall.c, syscall.h, sysproc.c, user.h和usys.S等几个文件。参照uptime系统调用的写法,增加date系统调用。
syscall.c: extern int sys_date(void);
syscall.c: [SYS_date] sys_date,
syscall.h: #define SYS_date 22
user.h: int date(struct rtcdate *r);
usys.S: SYSCALL(date)b
在sysproc.c中给出date的实现
int
sys_date(void)
{
struct rtcdate *r;
if (argptr(0, (char **) &r, sizeof(struct rtcdate)) < 0)
return -1;
cmostime(r);
return 0;
}
第二步:增加个用户测试程序date.c:
#include "types.h"
#include "user.h"
#include "date.h"
int
main(int argc, char *argv[])
{
struct rtcdate r;
if (date(&r)) {
printf(2, "date failed\n");
exit();
}
printf(1, "%d-%d-%d %d:%d:%d\n", r.year, r.month, r.day, r.hour, r.minute, r.second);
exit();
}
修改Makefile,增加对date.c的支持。
UPROGS=\
......
_date\
最后,运行 make qemu,重新编译xv6,在xv6的运行终端中运行date命令观察结果。