2012-01-20 1 views
2

Любой может понять, почему следующая сослагательные наклонение, линии 3279-3285 в xv6-Rev6 коде, используются: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 {...} 
+0

Два утверждения внутри 'if', вероятно, были разными, но позже были изменены. Есть ли какой-нибудь журнал изменений, который вы можете проверить для файла (например, как CVS/SVN/GIT журнал?) В противном случае вы должны спросить разработчиков. –

ответ

1

Мой первоначальный ответ ниже, который частично прав.

Я позволил себе контактирование авторов на 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).

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

+0

Код rev5 имеет более короткую версию. Поэтому я предполагаю, что это неудачная попытка чего-то или подготовка к чему-то в будущем. – Morass

+0

@ Морасс, ты можешь быть прав. v5 (http://www.scribd.com/doc/58105832/xv6-rev5) имеет только один диапазон проверки _and_ отсутствие пробела в файле заголовка. Я отправил записку на адрес электронной почты со ссылкой на этот вопрос - ответ на этот вопрос, кто знает? – paxdiablo

 Смежные вопросы

  • Нет связанных вопросов^_^