2012-01-20 81 views
2

任何一個可以看到爲什麼以下IFS,線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_readSYS_fstat位於第一組。

也許你應該聯繫作者問他們(6.828-staff at pdos.csail.mit.edu)。

我知道(因爲我有這本書),它並沒有從獅子時代的代碼中繼承下來,因爲它在列表中沒有這樣的空白 - 它們也以不同的順序排列,讀寫下一個例如彼此之間。

+0

rev5代碼的版本較短。所以我想無論是對某件事的嘗試失敗,還是對未來某件事的準備。 – Morass

+0

@Morass,你可能是對的。 v5(http://www.scribd.com/doc/58105832/xv6-rev5)在頭文件中只有單一範圍檢查_and_沒有間隙。我已經發送了一個筆記到這個問題的鏈接 - 他們可以_may_答案,誰知道? – paxdiablo

相關問題