Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: Cheebi am 31. July 2006, 20:12
-
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
-
Im osfaq (http://www.mega-tokyo.com/osfaq/HardWareIrq) sollte alles stehen :wink:
-
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
-
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
-
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
-
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
-
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
-
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. ;-)
-
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