试图了解XV6上的UNIX系统调用

时间:2017-02-15 00:02:24

标签: c arrays pointers unix xv6

我正在尝试在XV6(文档可用here和Github here)上编写一个简单的系统调用,以了解它们是如何实现的。我已经使用了这些步骤

  1. syscall.c中,声明extern int sys_hello(void)并将[SYS_hello] sys_hello添加到static int (*syscalls[])(void)数组
  2. syscall.h中,将SYS_hello定义为电话号码22
  3. user.h中,将函数原型声明为int hello (void);
  4. usys.S中,将SYSCALL(hello)添加到宏
  5. sysproc.c中,在底部添加了功能sys_hello(void)

    int sys_hello(void)
    {
      cprintf ("Hello World System Call\n");
      return 0;
    }
    
  6. 创建hello.c只需调用hello()系统调用

  7. hello.c添加到Makefile并运行代码
  8. 它按预期工作。

    现在,我的问题是,似乎syscall.c中的数组将命令的索引与syscall.h文件中的系统调用号匹配 但是,如果我将hello位置移动到syscall.c中的第二个位置并让syscall.h中的系统命令编号保持为22,则系统命令将像以前一样工作。在哪里,我预计它会破裂。你能帮我理解数组syscall.c如何映射到syscall.h系统的电话号码(如果这是正确的话)?

    我对XV6和C很新,所以如果这个问题看起来很傻,请不要生我的气,我只是想学习。

    如果有帮助,这是我的XV6存储库的分支的Github链接:github.com/AdityaSingh/XV6

1 个答案:

答案 0 :(得分:2)

syscalls数组是syscall.c,它使用designated initialization语法,您可以在其中指定分配值的索引。

static int (*syscalls[])(void) = {
   [SYS_fork]    sys_fork,
}

SYS_fork,定义为1,指定要分配sys_fork的索引。因此,使用这种语法,元素的顺序并不重要。