xv6 rev6 странный код в syscall () - PullRequest
2 голосов
/ 20 января 2012

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

1 Ответ

1 голос
/ 20 января 2012

Ниже приведен мой оригинальный ответ, который частично прав.

Я позволил себе связаться с авторами в 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_read и SYS_fstat находятся в первой группе.

Возможно, вам следует обратиться к авторам, чтобы спросить их (6.828-staff at pdos.csail.mit.edu).

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

...