xv6 rev6 странный код в syscall()

Любой может понять, почему используются следующие ifs, строки 3279-3285 в коде 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 {...}

person Morass    schedule 20.01.2012    source источник
comment
Два утверждения внутри if, вероятно, когда-то были разными, но позже изменились. Есть ли какой-то журнал изменений, который вы можете проверить для файла (например, журнал CVS/SVN/GIT?). В противном случае вы должны спросить разработчиков.   -  person Some programmer dude    schedule 20.01.2012


Ответы (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).

Я знаю (так как у меня есть книга), что он не перенесен из кода эпохи львов, поскольку в нем нет таких пробелов в списке — они также в другом порядке, с чтением и записью рядом друг с другом для пример.

person paxdiablo    schedule 20.01.2012
comment
Код rev5 имеет более короткую версию. Так что я предполагаю, что это либо неудачная попытка чего-то, либо подготовка к чему-то в будущем. - person Morass; 20.01.2012
comment
@Морасс, возможно, ты прав. v5 (scribd.com/doc/58105832/xv6-rev5) имеет только проверка одного диапазона и отсутствие пробелов в заголовочном файле. На почту отправил записку со ссылкой на этот вопрос - может ответят, кто знает? - person paxdiablo; 20.01.2012