2017-02-15 102 views
2

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

  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,在底部

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

  7. 新增hello.cMakefile添加的功能sys_hello(void)并运行代码

它的工作如预期。

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

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

这里是Github上链接到我的XV6库叉是否有帮助:github.com/AdityaSingh/XV6

回答

2

系统调用的阵列syscall.c利用了designated initialization语法,你可以指定在此指数赋值。

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

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