3

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

  1. syscall.c,声明extern int sys_hello(void)并添加[SYS_hello] sys_hellostatic 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.cMakefile并运行代码

它按预期工作。

现在,我的问题是 syscall.c 中的数组似乎将命令的索引与 syscall.h 文件中的系统调用号相匹配但是,如果我将 hello 位置移动到 syscall.c 中的第二个位置并让syscall.h 中的系统命令号保持 22 系统命令和以前一样工作。在哪里,我预计它会坏掉。你能帮我理解数组 syscall.c 是如何映射到 syscall.h 系统调用号的吗?

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

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

4

1 回答 1

3

系统调用数组是 syscall.c 使用指定的初始化语法,您可以在其中指定在哪个索引处分配值。

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

SYS_fork,定义为 1,指定要分配的索引sys_fork。因此,使用此语法,元素的顺序无关紧要。

于 2017-02-15T00:34:28.237 回答