我正在尝试在 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