xv6 rev6 syscall()中的奇怪代码

时间:2012-01-20 09:17:42

标签: c unix xv6

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

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

而不只是:

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

1 个答案:

答案 0 :(得分: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_readSYS_fstat都在第一组中。

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

我知道(因为我有这本书),它并没有从狮子会时代的代码中延续下来,因为在列表中没有这样的空白 - 它们也有不同的顺序,旁边有读写彼此相关。例如。