"os161“操作系统包含以下代码。具体来说,这里定义了syscall:
...
#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都得到一个数字。我似乎不知道这些数字的用途是什么。
我不是问syscall数字的用法,而是要求将参数num用于宏SYSCALL。我找不到它的用途。
即使将syscall号移到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的论点怎么会有用呢?
发布于 2020-08-02 06:41:23
它用于其他工具,以简化源代码的维护。
以下是理解系统调用的引文
S:这个文件是在编译时从syscalls-mips.S创建的,是组装到C库中的实际文件。系统调用的实际名称被放置在这个文件中,它使用一个名为callno-parse.sh的脚本从内核的头文件中读取它们。这避免了系统调用的第二个列表。在实际系统中,通常每个系统调用存根都放在自己的源文件中,以便有选择地将它们链接到其中。OS/161号文件将所有这些内容组合在一起,以简化制作过程。在重新构建用户级代码时,向callno.h添加新的条目会自动导致定义新的用户级系统调用过程。该文件中的每个"SYSCALL(name,num)“宏语句都由C预处理器扩展为相应系统调用函数的声明。
kern/syscall.h很可能是由其中一个工具生产的。
https://stackoverflow.com/questions/63212933
复制相似问题