作业原地址: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命令观察结果。

results matching ""

    No results matching ""