Autor Thema: Sofortige Tastaturinterrupt nach Aktivieren der Hardwareinterrupts  (Gelesen 17631 mal)

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #20 am: 30. November 2014, 20:30 »
Du hast ja einen Pointer auf den aktuellen Task, oder nicht? Den könntest du auch für die Suche nehmen.
Dieser Text wird unter jedem Beitrag angezeigt.

s137

  • Beiträge: 110
    • Profil anzeigen
Gespeichert
« Antwort #21 am: 30. November 2014, 21:24 »
ja stimmt daran habe ich gar nicht gedacht... Danke :DD

s137

  • Beiträge: 110
    • Profil anzeigen
Gespeichert
« Antwort #22 am: 30. November 2014, 21:42 »
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;
}

OsDevNewbie

  • Beiträge: 282
    • Profil anzeigen
    • YourOS Kernel
Gespeichert
« Antwort #23 am: 30. November 2014, 21:52 »
Du hast wahrscheinlich vergessen die Headerdatei einzubinden oder die Struktur ist nicht definiert.
Viele Grüsse
OsDevNewbie

Ein Computer ohne Betriebsystem ist nicht mehr wert als ein Haufen Schrott.
Ein Computer ist eine Maschine, die einem Lebewesen das kostbarste klaut, was sie selber nicht hat:
DIE ZEIT DES LEBENS

s137

  • Beiträge: 110
    • Profil anzeigen
Gespeichert
« Antwort #24 am: 30. November 2014, 22:24 »
Nein eben nicht... die Struktur ist in der Headerdatei die ich eingebunden habe ^^ Hätte ich vlt noch erwähnen sollen..

s137

  • Beiträge: 110
    • Profil anzeigen
Gespeichert
« Antwort #25 am: 30. November 2014, 22:26 »
Edit: Oh nein doch nicht... ich dachte das nur... ich dachte ich hatte die Struktur in der Headerdatei definiert... habs jetzt so dass es funktioniert. Danke

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #26 am: 02. December 2014, 00:03 »
Ok danke, das heißt ich sollte meien Tasks erstmal eine eindeutige ID zuweisen...
Nein, ich meinte damit eher, dass es verschiedene Datenstrukturen mit verschiedenen Vor- und Nachteilen gibt. ;-)

Mit dem Pointer alleine kommst du klar, wenn du eine doppelt verkettete Liste baust.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #27 am: 02. December 2014, 10:21 »
Zur Identifikation reicht ein Pointer auch bei einer einfach verketteten Liste. Der Unterschied ist nur, dass man die einfach verkettete Liste noch durchgehen muss, während man bei der doppelten direkt an alles rankommt, was man verändern will.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

s137

  • Beiträge: 110
    • Profil anzeigen
Gespeichert
« Antwort #28 am: 03. December 2014, 17:53 »
Ah ok, danke :DD Dann werd ich mir mal doppelte verkettete Listen anschauen.. ist vermutlich einfacher :DD

 

Einloggen