2017-02-15 104 views
2

我試圖寫一個簡單的系統調用XV6(文檔可用here和Github here),以瞭解它們是如何實現的。我已經使用這些步驟試圖瞭解XV6上的UNIX系統調用

  1. syscall.c,宣告extern int sys_hello(void)並加入到[SYS_hello] sys_hello陣列static int (*syscalls[])(void)
  2. syscall.h,定義SYS_hello呼叫號碼22
  3. user.h,聲明的函數原型int hello (void);
  4. usys.S中,將SYSCALL(hello)添加到宏
  5. sysproc.c,在底部

    int sys_hello(void) 
    { 
        cprintf ("Hello World System Call\n"); 
        return 0; 
    } 
    
  6. 創建hello.c這只是調用hello()系統調用

  7. 新增hello.cMakefile添加的功能sys_hello(void)並運行代碼

它的工作如預期。

現在,我的問題是,似乎syscall.c中的數組與syscall.h文件中的系統調用號碼的命令索引相匹配 但是,如果我將hello位置移動到第二個位置syscall.c並讓syscall.h中的系統命令號保持22,系統命令與以前一樣工作。在哪裏,我預計它會中斷。你能幫我理解數組syscall.c如何映射(如果這甚至是正確的話)到syscall.h系統調用號?

我對XV6和C相當陌生,所以如果這個問題看起來很愚蠢,請不要生我的氣,我只是在努力學習。

這裏是Github上鍊接到我的XV6庫叉是否有幫助:github.com/AdityaSingh/XV6

回答

2

系統調用的陣列syscall.c利用了designated initialization語法,你可以指定在此指數賦值。

static int (*syscalls[])(void) = { 
    [SYS_fork] sys_fork, 
} 

SYS_fork,定義爲1個,指定在哪裏分配sys_fork索引。因此,使用此語法元素的順序無關緊要。