2014-11-21 14 views
5

Ich versuche, einen einfachen prioritätsbasierten Scheduler in XV6 zu erstellen. Dazu muss ich auch einen Systemaufruf erstellen, mit dem ein Prozess seine Priorität festlegen kann. Ich habe alles getan, was erforderlich, um den Systemaufruf zu erstellen, wie hier und an anderer Stelle diskutiert:Wie übergebe ich einen Wert in XV6 in eine Systemaufruffunktion?

how do i add a system call/utility in xv6

Das Problem ist, ich kann keine Variablen übergeben, wenn ich die Funktion aufrufen, oder besser gesagt, es läuft wie nichts ist falsch, aber Die korrekten Werte werden nicht in der Funktion angezeigt.

Extern-Deklaration (syscall.c):

... 
extern int sys_setpty(void); 

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

Sys-Rufvektor (syscall.h):

#define SYS_setpty 22 

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

Macro (usys.S):

SYSCALL(setpty) 

Funktionsaufruf:

setpty(3, 50); 

Ausgang:

function pid: 16843009 
function pty: 16843009 

Die Werte sind immer die gleiche genaue Zahl: 16843009. Ich habe überprüft, ob cprintf korrekt funktioniert, indem pid und pty Werte zugewiesen werden. Ich habe ungefähr 6 Stunden damit verbracht, jede mögliche Kombination von allem zu versuchen, was mir einfällt, und ich fange an zu denken, dass es keinen eingebauten Mechanismus für die Weitergabe von Werten über einen Systemaufruf in XV6 gibt. Fehle ich etwas? Vielen Dank im Voraus.

Antwort

8

Die Übergabe von Argumenten von Funktionen auf Benutzerebene an Funktionen auf Kernel-Ebene kann in XV6 nicht durchgeführt werden. XV6 hat seine eigenen eingebauten Funktionen, um Argumente in eine Kernelfunktion zu übergeben. Um beispielsweise eine Ganzzahl zu übergeben, wird die Funktion argint() aufgerufen. Bei der Implementierung, die ich für die Set-Priorität-Funktion verwendet, das wäre in etwa so aussehen:

argint(0, &pid); 

... das erste Argument zu erhalten, die die Prozess-ID ist, und:

argint(1, &pty); 

. .. um das zweite Argument zu bekommen, welches die gewünschte Priorität ist. Der Funktionsaufruf vom Benutzerprozess sieht wie folgt aus:

setpty(getpid(), priority); 
+0

Ich stecke an demselben Punkt, könnten Sie elaborate? – WannaBeCoder

+0

Es ist ein paar Monate her, seit ich damit gespielt habe, werde ich versuchen, aber ich bin unklar, was Sie ausgearbeitet brauchen. – bertmoog

+0

Dank Ihrer eigenen Antwort +1 habe ich gelernt, wie man Parameter vom User-Space zum Kernel-Space übergibt. Ich konnte jedoch keine prioritätsbasierte Planung durchführen. :( – WannaBeCoder

Verwandte Themen