【发布时间】:2017-02-15 00:02:23
【问题描述】:
我正在尝试在 XV6 上编写一个简单的系统调用(文档可用 here 和 Github here),以了解它们是如何实现的。我已经使用了这些步骤
- 在
syscall.c中,声明extern int sys_hello(void)并将[SYS_hello] sys_hello添加到static int (*syscalls[])(void)数组中 - 在
syscall.h中,将SYS_hello定义为电话号码22 - 在
user.h中,将函数原型声明为int hello (void); - 在
usys.S中,将SYSCALL(hello)添加到宏中 -
在
sysproc.c,底部添加函数sys_hello(void)int sys_hello(void) { cprintf ("Hello World System Call\n"); return 0; } 创建了
hello.c,它只调用了hello()系统调用- 将
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