2014-11-21 92 views
5

Próbuję utworzyć prosty harmonogram oparty na priorytecie w XV6. Aby to zrobić, muszę również utworzyć wywołanie systemowe, które pozwoli procesowi ustawić jego priorytet. Zrobiłem wszystko, co niezbędne do stworzenia połączenia systemowego jak omówiono tutaj i gdzie indziej:Jak przekazać wartość do funkcji wywołania systemowego w XV6?

how do i add a system call/utility in xv6

Problem polega na tym, że nie może przekazać żadnych zmiennych, kiedy wywołanie funkcji, a raczej działa jak nic nie jest źle, ale prawidłowe wartości nie pojawiają się wewnątrz funkcji.

Zewnętrzne deklaracja (syscall.c):

... 
extern int sys_setpty(void); 

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

Sys-call Vector (syscall.h):

#define SYS_setpty 22 

Realizacja (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); 

Makro (usys.S): Zapytaj

SYSCALL(setpty) 

Funkcja:

setpty(3, 50); 

wyjściowa:

function pid: 16843009 
function pty: 16843009 

Wartości są zawsze takie same dokładny numer: 16843009. Mam sprawdzane, czy cprintf działa poprawnie, przypisując wartości do pid i pty. Spędziłem około 6 godzin próbując każdej możliwej kombinacji wszystkiego, co mogę wymyślić i zaczynam myśleć, że nie ma wbudowanego mechanizmu przekazywania wartości przez wywołanie systemowe w XV6. Czy czegoś brakuje? Z góry dziękuję.

Odpowiedz

8

Przekazywanie argumentów z funkcji poziomu użytkownika do funkcji poziomu jądra nie może być wykonywane w XV6. XV6 ma wbudowane funkcje do przekazywania argumentów do funkcji jądra. Na przykład, aby przekazać liczbę całkowitą, wywoływana jest funkcja argint(). W realizacji, że używany przez funkcję ustawiania priorytetu, który będzie wyglądał mniej więcej tak:

argint(0, &pid); 

... zdobyć pierwszy argument, który jest identyfikator procesu, a:

argint(1, &pty); 

. .. aby uzyskać drugi argument, który jest pożądanym priorytetem. Wywołanie funkcji z procesu użytkownika wygląda następująco:

setpty(getpid(), priority); 
+0

Utknąłem w tym samym punkcie, który mógłbyś wykuć? – WannaBeCoder

+0

Minęło kilka miesięcy, odkąd się z tym bawiłem, spróbuję, ale nie jestem pewien, czego potrzebujesz. – bertmoog

+0

Dzięki własnej odpowiedzi +1 otrzymałem sposób przekazywania parametrów z przestrzeni użytkownika do przestrzeni jądra. Jednak nie mogłem wykonywać priorytetów opartych na harmonogramach. :( – WannaBeCoder