c-在这段代码中,参数num有什么用



os161";操作系统包含以下代码。具体来说,在定义系统调用的地方:

...
#include <kern/syscall.h>
...
#define SYSCALL(sym, num) 
.set noreorder       ; 
.globl sym           ; 
.type sym,@function      ; 
.ent sym         ; 
sym:                ; 
j __syscall                  ; 
addiu v0, $0, SYS_##sym  ; 
.end sym         ; 
.set reorder
...
SYSCALL(fork, 0)
SYSCALL(vfork, 1)
SYSCALL(execv, 2)
SYSCALL(_exit, 3)
SYSCALL(waitpid, 4)
SYSCALL(getpid, 5)
...

在底部,每个系统调用都会得到一个数字。我似乎不明白这些数字有什么用。

我不是在询问系统调用号的使用,而是在询问宏SYSCALL的参数num的使用。我找不到它在哪里使用。

即使系统调用编号移动到v0,也不会使用参数num。相反,它移动文件kern/syscall.h:中定义的常量

...
#define SYS_fork         0
#define SYS_vfork        1
#define SYS_execv        2
#define SYS__exit        3
#define SYS_waitpid      4
#define SYS_getpid       5
...

num这个论点怎么会有用呢?

它用于其他工具,以简化源代码的维护
下面引用了Understanding System Calls

syscalls.S:这个文件是在编译时从syscalls-mips.S创建的,是组装到C库中的实际文件。系统调用的实际名称使用一个名为callno-parse.sh的脚本放置在该文件中,该脚本从内核的头文件中读取系统调用。这就避免了必须对系统调用进行第二次列表。在实际系统中,通常每个系统调用存根都放在自己的源文件中,以允许选择性地将它们链接到。OS/161将它们放在一起以简化生成文件。向callno.h添加新条目会自动导致在重新构建用户级代码时定义新的用户级系统调用过程。每个";SYSCALL(名称;该文件中的宏语句由C预处理器扩展为适当的系统调用函数的声明。

kern/syscall.h很可能是由其中一个工具生成的。

相关内容

最新更新