1
Lowlevel-Coding / Problem mit der IDT
« am: 02. March 2006, 18:54 »
Hallo!
Ja du hast wahrscheinlich im IDT Deskriptor einen Fehler gemacht. Ich kann im ausführbaren Code keinen erkennen.
Das dritte WORD beim IDT Deskriptor muss folgendes Format haben:
|P|DPL|0|Typ|0|0|0|DWord-Count|
P (Present) muss 1 sein, wenn der Interrupthandler nicht ausgelagert ist
DPL (Privilegierungsstufe) sollte 00 sein
Typ sollte 1110 für ein Interrupt-Gate sein
DWord-Count brauchst du wahrscheinlich nicht und sollte deshalb 00000 sein
Um es nochmal auf den Punkt zu bringen sollte die dritte Zeile nach "idt_DIV_ERROR:" so aussehen:
dw 1000111000000000b
Nun solltest du problemlos deine Exception bekommen ^^
Außerdem solltest du nach dem Label "PMODE:" als erstes das Datensegment aktualisieren und dann erst Code Segmentstartadresse auf 0 setzen:
mov ax, 8
mov ds, ax
mov WORD [gdt_CODE_Desc+2], 0
...
...
Denn damit verhinderst du, dass die Nullen ganzwoanders in den Speicher geschrieben werden, weil in ds ja noch das Realmode Segment steht und nicht der Deskriptor für den P-Mode.
PS: Du solltest auf keinen Fall Code- und Datensegment über den kompletten virtuellen Adreßraum von 4 GB!!!! gehen lassen. Denn erstens hast du wahrscheinlich gar keine 4GB zur verfügung und zweitens sollte das Codesegment auch wirklich nur den Code enthalten den man ausführen will. Sonst kann es durch Programmfehler auch passieren, dass nichtausführbarer Code ausgeführt wird, wodurch der Prozessor abstürzt.
Ja du hast wahrscheinlich im IDT Deskriptor einen Fehler gemacht. Ich kann im ausführbaren Code keinen erkennen.
Das dritte WORD beim IDT Deskriptor muss folgendes Format haben:
|P|DPL|0|Typ|0|0|0|DWord-Count|
P (Present) muss 1 sein, wenn der Interrupthandler nicht ausgelagert ist
DPL (Privilegierungsstufe) sollte 00 sein
Typ sollte 1110 für ein Interrupt-Gate sein
DWord-Count brauchst du wahrscheinlich nicht und sollte deshalb 00000 sein
Um es nochmal auf den Punkt zu bringen sollte die dritte Zeile nach "idt_DIV_ERROR:" so aussehen:
dw 1000111000000000b
Nun solltest du problemlos deine Exception bekommen ^^
Außerdem solltest du nach dem Label "PMODE:" als erstes das Datensegment aktualisieren und dann erst Code Segmentstartadresse auf 0 setzen:
mov ax, 8
mov ds, ax
mov WORD [gdt_CODE_Desc+2], 0
...
...
Denn damit verhinderst du, dass die Nullen ganzwoanders in den Speicher geschrieben werden, weil in ds ja noch das Realmode Segment steht und nicht der Deskriptor für den P-Mode.
PS: Du solltest auf keinen Fall Code- und Datensegment über den kompletten virtuellen Adreßraum von 4 GB!!!! gehen lassen. Denn erstens hast du wahrscheinlich gar keine 4GB zur verfügung und zweitens sollte das Codesegment auch wirklich nur den Code enthalten den man ausführen will. Sonst kann es durch Programmfehler auch passieren, dass nichtausführbarer Code ausgeführt wird, wodurch der Prozessor abstürzt.