2012-01-20 40 views
2

任何一个可以看到为什么以下IFS,线3279-3285在XV6-rev6代码, 使用:XV6 rev6在系统调用怪代码()

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 {...} 
+0

'if'中的两个语句可能有一次不同,但后来改变了。是否有可以检查该文件的某种更新日志(如CVS/SVN/GIT日志?)否则,您必须询问开发人员。 –

回答

1

我原来的答案在下面,这是部分正确的。

我把接触在MIT作者的自由和接收以下响应:

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)。

我知道(因为我有这本书),它并没有从狮子时代的代码中继承下来,因为它在列表中没有这样的空白 - 它们也以不同的顺序排列,读写下一个例如彼此之间。

+0

rev5代码的版本较短。所以我想无论是对某件事的尝试失败,还是对未来某件事的准备。 – Morass

+0

@Morass,你可能是对的。 v5(http://www.scribd.com/doc/58105832/xv6-rev5)在头文件中只有单一范围检查_and_没有间隙。我已经发送了一个笔记到这个问题的链接 - 他们可以_may_答案,谁知道? – paxdiablo

相关问题