A.)Angenommen, ich bin so weit, dass ich eine IDT erstellen möchte, definiere ich die IDT besser vor oder nach nach dem einschalten des PM?
Danach. Ein linearer(er) Adressraum ist nämlich sehr praktisch.
C.) Wie kann ich Exeption 13 (General Protection Fault) abfangen, so dass ich mit meinem Programm weiter machen kann?
Gar nicht.
Ein GPF kann durch alles mögliche entstehen. Irgendwie musst du also rausfinden, was passiert ist. Das ist mMn schon mal nicht möglich.
Und selbst wenn du herausbekommen hast, was die Ursache für einen GPF ist, was willst du dann tun? Wenn zum Beispiel ein ungültiger Befehl ausgeführt wurde oder ein ungültiger Speicher adressiert wurde (oder was auch immer einen GPF auslöst), willst du dann diesen Befehl korrigieren oder überspringen? Was wenn das Programm danach nicht mehr konsistent ist. Folgendes Programm mal als Beispiel:
mov dword [foo], 0x12345678
mov eax, [foo]
mov ebx, [eax] ; <--- das löst einen GPF aus
;...
; daten:
foo dd 0
macht. Willst du dann den Befehl überspringen? Was machst du wenn das Programm aber den wert in ebx unbedingt braucht? Ãnderst du dann eax oder ebx? Und was machst du mit [foo]? Wenn das Programm z.B. gerade in einer Schleife ist, willst du dann, dass der Fehler nochmal passiert oder änderst du [foo] gleich mit? Woher weisst du dass du [foo] ändern darfst, und dass es nicht vielleicht doch was anderes bedeutet?
Dann das wichtigste überhaupt: Ein GPF bedeutet, dass das Programm etwas ganz böses gemacht hat, und jetzt sofort beendet werden muss. Das ist ein Befehl von der CPU.