我正在尝试在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
答案 0 :(得分:2)
syscalls数组是syscall.c,它使用designated initialization语法,您可以在其中指定分配值的索引。
static int (*syscalls[])(void) = {
[SYS_fork] sys_fork,
}
SYS_fork
,定义为1,指定要分配sys_fork
的索引。因此,使用这种语法,元素的顺序并不重要。