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.
Ich stecke an demselben Punkt, könnten Sie elaborate? – WannaBeCoder
Es ist ein paar Monate her, seit ich damit gespielt habe, werde ich versuchen, aber ich bin unklar, was Sie ausgearbeitet brauchen. – bertmoog
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