Noch eine andere Frage, ich implementiere gerade Paging, und ein Teil davon ist es ja am Ende des Interrupthandlers falls sich der Status der CPU geändert hat das neue Pagedirectory des aktuellen Tasks zu laden. Jetzt habe ich eine Datei idt.c in der mein Interrupthandler sowie das ganze Interruptzeug liegt und eine Datei task.c in der das ganze Zeug zum Initialisieren von Tasks und die schedule Funktion liegen. Weil ich jetzt im Interrupthandler auf das Pagedirectory des aktuellen Tasks zugreifen will, hab ich mir eine Funktion "getCurrentTask()" gebastelt die mir einen Pointer auf den aktuellen Task zurückgibt, allerdings bekomme ich immer die Fehlermeldung " Fehler: Dereferenzierung eines Zeigers auf unvollständigen Typen" wenn ich auf den Pointer zugreifen will.
Hier mal mein Code im Interrupthandler:
static struct task* c_task = NULL; // Diese Zeile steht weiter oben im Code
// Code am Ende des Interrupthandlers:
if (cpu != new_cpu) {
c_task = getCurrentTask();
asm volatile("mov %0, %%cr3" : : "r" (c_task->context->pagedir));
}
Und hier noch die Funktion:
struct task* getCurrentTask(void) {
if (current_task != NULL) {
return current_task;
}
return first_task;
}