gpt4 book ai didi

c - syscall() 中的 xv6 rev6 奇怪代码

转载 作者:太空宇宙 更新时间:2023-11-03 23:55:28 24 4
gpt4 key购买 nike

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

最佳答案

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

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

The code in the second half of the if wrapped the system call in a begin_trans/commit_trans. We later moved the transaction start/end deeper into individual system calls, but forgot to fix 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)。

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

关于c - syscall() 中的 xv6 rev6 奇怪代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8939069/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com