【问题标题】:What is the use of the argument num in this code?这段代码中参数 num 的用途是什么?
【发布时间】:2020-11-22 13:06:06
【问题描述】:

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 的论点怎么会有用?

【问题讨论】:

  • 粘贴冗长的版权声明不会使问题更容易理解。考虑编辑并只保留相关部分!
  • @dash-o 当然。谢谢。
  • 据我了解,它根本没有使用。我怀疑以前版本的其余部分使用SYSCALL 宏来定义SYS_sym,而不是将这些定义放在kern/syscall.h 中。现在它仍然至少有一个好处:即使num 参数被宏忽略,代码仍然显示每个已安装系统调用的系统调用号。无论如何,您是否尝试将其删除并运行一些测试?
  • @dash-o 不确定您对版权声明的建议是否明智。您要删除的版权声明明确指出不应删除它...

标签: c operating-system kernel mips os161


【解决方案1】:

用于其他工具,方便源代码的维护。
以下为Understanding System Calls引用的一段话

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-02
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 2013-11-24
    相关资源
    最近更新 更多