2014-11-21 181 views
5

我正在嘗試在XV6中創建一個簡單的基於優先級的調度程序。爲此,我還必須創建一個系統調用,以允許進程設置其優先級。我已經做了創建系統調用所需的一切,在這裏和其他地方討論:如何將值傳遞給XV6中的系統調用函數?

how do i add a system call/utility in xv6

的問題是,當我打電話的功能,或者說我無法通過任何變量,它運行像什麼是錯的,但函數內部不會顯示正確的值。

extern聲明(syscall.c):

... 
extern int sys_setpty(void); 

static int (*syscalls[])(void) = { 
... 
[SYS_setpty] sys_setpty, 
}; 

Sys系統呼叫向量(syscall.h):

#define SYS_setpty 22 

實施(sysproc.c):

void 
sys_setpty(int pid, int pty) 
{ 
    cprintf("function pid: %d \n", pid); 
    cprintf("function pty: %d \n", pty); 
} 

(defs.h & user.h):

void setpty(int, int); 

微距(usys.S):

SYSCALL(setpty) 

函數調用:

setpty(3, 50); 

輸出:

function pid: 16843009 
function pty: 16843009 

的值總是相同的確切數目:16843009.我有通過將值分配給pid和pty來檢查cprintf是否工作正常。我已經花了大約6個小時嘗試了所有我能想到的所有可能的組合,並且我開始認爲在XV6中沒有通過系統調用傳遞值的內置機制。我錯過了什麼嗎?先謝謝你。

回答

8

無法在XV6中將用戶級函數的參數傳遞給內核級函數。 XV6有自己的內置函數,用於將參數傳遞到內核函數中。例如,要傳入一個整數,將調用argint()函數。在我使用的設置優先功能的實現,這將是這個樣子:

argint(0, &pid); 

...要獲取的是進程ID的第一個參數,並且:

argint(1, &pty); 

。 ..獲得第二個參數,這是理想的優先級。來自用戶進程的函數調用如下所示:

setpty(getpid(), priority); 
+0

我被困在同一點,你能否說出來? – WannaBeCoder 2015-03-15 13:00:38

+0

我已經玩了幾個月了,我會嘗試,但我不清楚你需要詳細說明。 – bertmoog 2015-03-16 18:39:11

+0

感謝您自己的答案+1,我得到了如何將參數從用戶空間傳遞到內核空間。但是我無法做基於優先級的調度。 :( – WannaBeCoder 2015-03-17 07:30:05