2

任何人都可以看到为什么使用以下 ifs,即 xv6-rev6 代码中的第 3279-3285 行:

int num;
num = proc−>tf−>eax;
if (num >= 0 && num < SYS_open && syscalls[num]) {
    proc−&gt;tf−&gt;eax = syscalls[num]();
} else if (num >= SYS_open && num < NELEM(syscalls) && syscalls[num]) {
    proc−&gt;tf−&gt;eax = syscalls[num]();
} else {...}

而不仅仅是:

int num;
num = proc−&gt;tf−&gt;eax;
if (num >= 0 && num < NELEM(syscalls) && syscalls[num]) {
   proc−&gt;tf−&gt;eax = syscalls[num]();
} else {...}
4

1 回答 1

1

我的原始答案如下,部分正确。

我冒昧地联系了麻省理工学院的作者,并收到了以下回复:

后半部分的代码if将系统调用包装在begin_trans/commit_trans. 后来我们将事务开始/结束更深入地移到了单独的系统调用中,但忘记了修复syscall().

所以这两个部分不同的,当它们被更改为相同时,修改根本没有将这两个部分重新合并在一起。


不,这两位代码是等价的。

可能在某些时候,调用以syscalls[?]()某种方式不同,无论是参数还是返回位置,但现在情况并非如此。

那里也可能存在某种差距,这可能得到了第 3115 行空白行的支持:

// System call numbers
#define SYS_fork         1
#define SYS_exit         2
#define SYS_wait         3
#define SYS_pipe         4
#define SYS_read         5
#define SYS_kill         6
#define SYS_exec         7
#define SYS_fstat        8
#define SYS_chdir        9
#define SYS_dup         10
#define SYS_getpid      11
#define SYS_sbrk        12
#define SYS_sleep       13
#define SYS_uptime      14

#define SYS_open        15
#define SYS_write       16
#define SYS_mknod       17
#define SYS_unlink      18
#define SYS_link        19
#define SYS_mkdir       20
#define SYS_close       21

这是完整的内容syscalls.h和空白行有点可疑。

没有明显的功能分组 - 尽管所有 15 及以上的功能似乎都与文件系统操作有关,SYS_read并且SYS_fstat属于第一组。

也许您应该联系作者询问他们(6.828-staff at pdos.csail.mit.edu)。

我知道(因为我有这本书)它不是从狮子时代的代码中继承下来的,因为列表中没有这样的空白——它们的顺序也不同,读取和写入彼此相邻例子。

于 2012-01-20T09:21:18.443 回答