任何人都可以看到为什么以下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 {...}
答案 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_read
和SYS_fstat
都在第一组中。
也许您应该联系作者询问他们(6.828-staff at pdos.csail.mit.edu
)。
我知道(因为我有这本书),它并没有从狮子会时代的代码中延续下来,因为在列表中没有这样的空白 - 它们也有不同的顺序,旁边有读写彼此相关。例如。