Ниже приведен мой оригинальный ответ, который частично прав.
Я позволил себе связаться с авторами в 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
).
Я знаю (поскольку у меня есть книга), что она не перенесена из кода эры Льва, поскольку в списке нет таких пробелов - они также в другом порядке, с чтением и записьюнапример, рядом.