Autor Thema: Implementierung des Exception-Handlers  (Gelesen 9012 mal)

[MM]

  • Beiträge: 130
    • Profil anzeigen
    • www.mmcoding.eu
Gespeichert
« am: 26. July 2006, 15:44 »
Hallo, ich bin grad dabei in mein OS einen richtigen Exception-Handler zu implementieren, bisher habe ich einfach nur Interrupt-Gates benutzt, die auf entsprechende Stellen in meinem Kernel-Code verwiesen haben. Ich habe nun vor den Exception-Handler in einem eigenen Task laufen zu lassen und diesen per Task-Gate aufzurufen, dies hätte den Vorteil, dass ich mittels des TSS-BackLink-Feldes bestimmen kann, welcher Task unterbrochen wurde und gleich in dessen TSS zB den eip und alle anderen Register ausöesen kann. Nun ist aber mein Problem, dass ich bei einem Task-Gate keinen Offset angeben kann, da ja der eip des gerufenen Tasks verwendet wird, wie könnte ich nun unterscheiden welche Exception aufgetreten ist ohne für jede einen eigenen Task definieren zu müssen? Oder hab ihr das ganz anders implementiert, und wenn ja, wie?

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #1 am: 26. July 2006, 19:05 »
Na ja, ganz primitive Methode: alle Interrupts stoppen und Exception im Kernel behandeln.

Ansonsten den Task anhalten und über nen Message System weiterreichen.
*post*

[MM]

  • Beiträge: 130
    • Profil anzeigen
    • www.mmcoding.eu
Gespeichert
« Antwort #2 am: 26. July 2006, 23:10 »
Diese Methode mit der Fehlerbehandlung (vermutlich mittels Interrupt-Gate) direkt im Kernelcode ist jedoch nicht auf die Exception 10 (ungültiges TSS) anwendbar, da diese Fehlerbehandlung in einem neuen Task gestartet werden MUSS. Aber sonst hast du natürlich recht, diese Methode ist sicher die einfachste...

Mir würde allerdings die Methode alle Exceptions in einem speziellen Task zu behandeln besser gefallen (aus den Gründen, die ich in meinem ersten Post beschrieben habe), nur will ich nicht für jede der 15 Exceptions einen eigenen Handlertask einrichten, da so ein TSS ja auch nicht grad klein ist...

__OS_coder

  • Beiträge: 69
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 26. July 2006, 23:51 »
Wieso müsste bei Invalid TSS n neuer Task gestartet werden? Einfach den mit dem invalid TSS rausnehmen und fertisch ist... Wenn du Interrupt Gates benutzt wird doch Kernelcode ausgeführt, der ist taskunabhängig, sozusagen... also ick würd die Handler innen Kernelcode packen... ist viel einfacher zu implementieren und auch effizienter wie ick finde... Weil wenn sie als Task laufen können sie ja auch unterbrochen werden und des wär doch net soo gut...

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #4 am: 27. July 2006, 00:28 »
Auf jeden Fall müsste der Prozess in dem die Exception stattgefunden hat auf jeden Fall erstmal unterbrochen werden bis der Exception Handler ihn wieder aufweckt mit dem Ansatz.

Durchaus lässt sich dann aber so eine nicht-direkte Behandlung umsetzen, aber die dürfte nur irgendein anderes Verhalten geben (ausser das es kompliziert ist) wenn der Handler-Prozess nur hochstufig, aber normal im Scheduler behandelt wird.

Ansonsten - du brauchst ja theoretisch nicht für jeden Thread einen eigenen Addressraum, aber ne andere TSS schon, ausser es ist genau das was du mit Task meinst.

Abgesehen davon: Hardware Multitasking sux! *scnr*
*post*

[MM]

  • Beiträge: 130
    • Profil anzeigen
    • www.mmcoding.eu
Gespeichert
« Antwort #5 am: 27. July 2006, 02:30 »
Also, eine Exception 10 muss mittels eines Task-Gates behandelt werden, da sie bei einem Taskwechsel oder allgemein dem Laden eines TSS auftritt, und da man dann davon ausgehen kann, dass sich der Task in einem inkonstistenten Zusatnd befindet braucht man einen Task zur Behandlung, bei dem alles in Ordnung ist (http://pdos.csail.mit.edu/6.828/2005/readings/i386/s09_08.htm).
Und ich meinte tatsächlich, dass ich für jede Exception ein eigenes TSS bräuchte, wobei noch das Problem hinzukäme, dass man nach dem Verlassen des Handlers den eip wieder auf die Startposition zurücksetzen müßte, was irgendwie außerhalb des Tasks passieren müßte.

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #6 am: 27. July 2006, 09:31 »
Zitat von: Legend
Abgesehen davon: Hardware Multitasking sux! *scnr*


^^
*post*

[MM]

  • Beiträge: 130
    • Profil anzeigen
    • www.mmcoding.eu
Gespeichert
« Antwort #7 am: 27. July 2006, 10:27 »
Das mag zwar sein, aber mir ist noch ein Problem bei dem Exception-Handling per Interrupt-Gate eingefallen: Was macht man beim Stack-Overflow? Der Stack ist bereits voll und dann versucht der Interrupt noch was drauf zu pushen, mit dem Task-Gate kein Problem, aber mit dem Interrupt-Gate?

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #8 am: 27. July 2006, 10:29 »
Stackfault im Kernel ist so ziemlich sicher bald nen Triple Fault in viele Fällen. ;)
*post*

[MM]

  • Beiträge: 130
    • Profil anzeigen
    • www.mmcoding.eu
Gespeichert
« Antwort #9 am: 27. July 2006, 11:19 »
Aber wenn ich mich recht erinnere gibt es lediglich einen Doppel-Fehler, aber auch dieser könnte dann bei einem vollen Stack nicht bearbeitet werden, was einen richtigen Absturz zur Folge hätte oder übersehe ich da was?

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #10 am: 27. July 2006, 11:41 »
Das meine ich ja.
*post*

[MM]

  • Beiträge: 130
    • Profil anzeigen
    • www.mmcoding.eu
Gespeichert
« Antwort #11 am: 27. July 2006, 11:49 »
Naja, aber wie bahendeltst du dann einen solchen Fehler, wenn du dein Exception-Handling einfach nur per Interrupt-Gate machst?

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #12 am: 27. July 2006, 13:04 »
Ich glaube gar nicht.  :oops:
*post*

[MM]

  • Beiträge: 130
    • Profil anzeigen
    • www.mmcoding.eu
Gespeichert
« Antwort #13 am: 27. July 2006, 14:23 »
Hm, ärgerlich, was  :wink:
Zumindest das Problem mit der Exception 10 entsteht gar nicht erst, wenn man eh nur Software-Multitasking macht, aber das mit dem Stack ist schon irgendwie ärgerlich, wobei ich da noch mehr Probleme sehe: Angenommen man hat Teile des für den Stack vorgesehenen Speicher ausgelagert, und bei nem Push kommt es nun zum Page-Fault, dann kann ich auch keinen Handler per Interrupt-Gate aufrufen, da dies wieder einen Page-Fault verursachen würde...
Ich sehe da keine Alternative zu einem Task-Gate, du etwa?

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #14 am: 27. July 2006, 14:54 »
Ich frage mich nur - was willst du in dem aufgerufenem Task tun?

Wobei da ein Taskgate interessant ist, nur würde ich in den Kernel mit einer Art Failover-Stack (der nicht rausgeswappt werden kann) zeigen lassen.

Nur, was wird der retten wollen? Prozess abschiessen und Stack löschen? Geht wenn man einen Stack pro Thread hat, bei einem Stack für alles - was muss weg, was nicht?
*post*

[MM]

  • Beiträge: 130
    • Profil anzeigen
    • www.mmcoding.eu
Gespeichert
« Antwort #15 am: 27. July 2006, 15:01 »
Naja, was man nun genau in dem Handler-Thread machen sollte weiß ich auch nicht, aber viel wichtiger finde ich, dass das System an einer solchen Stelle schonmal nicht mehr abstürzen kann.

Und was meinst du mit "einem Stack für alles"? Meinst du damit den Stack des Kernels? Wenn der voll ist, dann ist natürlich aus, aber zumindest hat man dann noch die Chance den Exception-Task eine freundliche Fehlermeldung ausgeben zu lassen  :wink:

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #16 am: 27. July 2006, 15:07 »
Gut, wenn es einem der Aufwand das Wert ist kann man das natürlich machen. ;)
*post*

 

Einloggen