我试图写一个简单的系统调用XV6(文档可用here和Github here),以了解它们是如何实现的。我已经使用这些步骤试图了解XV6上的UNIX系统调用
- 在
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
,在底部int sys_hello(void) { cprintf ("Hello World System Call\n"); return 0; }
创建
hello.c
这只是调用hello()
系统调用- 新增
hello.c
到Makefile
添加的功能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