Autor Thema: Interrupt 8 bzw. 13?? wird durch IRQ1 ausgelöst!?  (Gelesen 3793 mal)

Cheebi

  • Beiträge: 91
    • Profil anzeigen
    • Cheebis Webseite
Gespeichert
Hallo,

ich habe nun die IDT geladen. Sie enthält die Infos zu 15 Interrupts und einem IRQ (IRQ1).
Auf einem Intel Pentium Rechner klappt alles, solange ich keine Taste drücke (also, solange kein IRQ1 auftritt). Wenn der eintritt, wird plötzlich bevor noch der IRQ1 abgearbeitet wird, Interrupt 8 ausgelöst. Also die Exception für Double Fault (was auch immer das ist).
Wenn ich das ganze auf einem AMD Rechner laufen lasse, wird schon beim Aktivieren der Interrupts die Exception 13 ausgelöst. (General Protection Exception(Triple Fault))  Woher das kommt, kann ich mir nicht erklären. Ich habe nur 2 Segmente (Ring00) in der GDT. Und die Ints in der IDT sind auch alle Privelegelevel 0.
Das kann ich mir einfach nicht erklären. An der IDT kanns eigentlich nicht liegen, da die Exceptionhandler ja auch gelesen werden können.

Gruß Cheebi
0100 1001 0100 1100 0100 0001 0010 0000 0011 1010 0010 1101 0010 1010
http://www.cheebi.de

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #1 am: 31. July 2006, 20:42 »
Im osfaq sollte alles stehen :wink:
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #2 am: 31. July 2006, 21:14 »
Hast du die IRQs mit dem PIC gar nicht umgebogen? Also dann zeigen Hardwareinterrupts ja auf Exceptions. Das sollte nicht so sein. Setze den IRQ0 mal auf "int 20h" und den IRQ8 auf "int 28h" (die anderen sind dann ja automatisch gleich dahinter). Der IRQ0 wird in regelmäßigen Abständen aufgerufen.

bitmaster
In the Future everyone will need OS-64!!!

Cheebi

  • Beiträge: 91
    • Profil anzeigen
    • Cheebis Webseite
Gespeichert
« Antwort #3 am: 01. August 2006, 13:09 »
hi,

ich hab die IRQs gebogen ja. nach 0x20 und 0x28 wie auch in den ganzen tuts. was ich jetzt eingebaut habe, ist das sichern der Ports vor dem Ansetzen zum mappen. Nun wird auch auf dem Pentiumrechner Interrupt13 ausgeführt und nicht wie zuvor Interrupt8. aber funktionieren tut da noch nix. ich bin einfach zu blöd...
maskiert habe ich nur IRQ1

Cheebi
0100 1001 0100 1100 0100 0001 0010 0000 0011 1010 0010 1101 0010 1010
http://www.cheebi.de

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #4 am: 01. August 2006, 16:45 »
Wieso erhält deine IDT dann nur Informationen für 15 Interrupts und einem IRQ? Setze die ersetzen 32 Interrupts mal auf einem Handler mit einer Endlosschleife. Die nächsten 16 Interrupts (IRQs) solltest du auch alle einem Handler zuweisen. Denke auch an einem EOI. Und natürlich dem ired.

bitmaster
In the Future everyone will need OS-64!!!

Cheebi

  • Beiträge: 91
    • Profil anzeigen
    • Cheebis Webseite
Gespeichert
« Antwort #5 am: 01. August 2006, 17:13 »
danke, werd ich gleich mal probieren. jetzt hab ich nur noch eine frage:
was ist der unterschied zwischen "iret" und "iretd"? (bzw. auch pushad und pusha?)

cheebi
0100 1001 0100 1100 0100 0001 0010 0000 0011 1010 0010 1101 0010 1010
http://www.cheebi.de

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 01. August 2006, 17:17 »
Die Befehle mit dem D sind einfach für den PM geschaffen.

Beim iret macht das glaub ich keinen Unterschied aus. Beim push/a werden einfach die 32-Bit Register gesichert anstatt nur den 16-Bittern.


Nooooooooooooos

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #7 am: 01. August 2006, 18:15 »
Zitat von: nooooooooos
Die Befehle mit dem D sind einfach für den PM geschaffen.

Beim iret macht das glaub ich keinen Unterschied aus. Beim push/a werden einfach die 32-Bit Register gesichert anstatt nur den 16-Bittern.


Nooooooooooooos
Nein, pusha und iret sind für den meisten assembler gleich mit pushad und iretd. Wenn du z.B. beim fasm USE32 und beim nasm [bits 32] im Code stehen hast macht der aus pusha automatisch pushad und aus iret iretd. Du brauchst da also nicht drauf zu achten.

bitmaster

EDIT: Beim iretq ist das aber nicht so. Fasm macht aus gründen die ich mir nicht erklären kann aus iret nicht automatisch iretq. Also nur für die 64 Bit Freaks unter uns. ;-)
In the Future everyone will need OS-64!!!

Cheebi

  • Beiträge: 91
    • Profil anzeigen
    • Cheebis Webseite
Gespeichert
« Antwort #8 am: 02. August 2006, 17:47 »
hi,

ich glaube, dass der General Protection Fault einfach ausgelöst wird, weil irgendetwas nicht richtig initielaisiert ist. Etwas in der GDT, weil ich wirklich grlaube, dass ich alles richtig umbiege und intialisiere, was die IDT und die Interrupts angeht... Ich guck mal weiter..
aber danke soweit....
Cheebi
0100 1001 0100 1100 0100 0001 0010 0000 0011 1010 0010 1101 0010 1010
http://www.cheebi.de

 

Einloggen