【问题标题】:xv6 rev6 strange code in syscall()xv6 rev6 syscall() 中的奇怪代码
【发布时间】:2012-01-20 09:17:42
【问题描述】:

任何人都可以看到为什么以下 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 {...}

【问题讨论】:

  • if 里面的两个语句可能曾经不同,但后来改变了。是否有可以检查文件的某种变更日志(例如 CVS/SVN/GIT 日志?)否则您必须询问开发人员。

标签: c unix xv6


【解决方案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)。

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

【讨论】:

  • rev5-code 的版本较短。所以我猜要么是失败的尝试,要么是为未来做准备。
  • @Morass,你可能是对的。 v5 (scribd.com/doc/58105832/xv6-rev5) 只有一个范围检查并且在头文件中没有间隙。我已向该电子邮件地址发送了一条附有此问题链接的便条 - 他们可能回答,谁知道呢?
猜你喜欢
  • 2012-09-10
  • 2015-03-24
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多