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