【问题标题】:Trying to understand UNIX system calls on XV6试图理解 XV6 上的 UNIX 系统调用
【发布时间】:2017-02-15 00:02:23
【问题描述】:

我正在尝试在 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 并运行代码

它按预期工作。

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

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

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

【问题讨论】:

    标签: c arrays pointers unix xv6


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 2022-01-23
      • 2019-04-22
      相关资源
      最近更新 更多