Hallo Community,
Schon den ganzen Tag versuche ich eine IDT anzulegen, leider ohne Erfolg so dass ich mal Teile meines Codes hier poste, vllt findet ja jemand den Fehler:
Zuerst die Struktur (habe ich von http://www.osdev.org/wiki/IDT):
Auf globaler Ebene habe ich einen Speicherbereich fuer die IDT reserviert (struct idt idt[256]).
Nun kommt die Funktion mit der ich einzelne IDT-Eintraege setze:
Ich habe mal einen Test-Eintrag erstellt:
(do_nothing ist eine Funtion die nur eine Anweisung enthaelt: 'iret', daher kann der fehler als auch nicht kommen).
Als Letztes kommt noch eine Funktion um die IDT zu laden (void loadidt(struct idt*)):
Das Ausfuehren eines int 0x7f erzeugt folgenden Fehler:
00046832145e[CPU0 ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting
Kann mir vllt jemand sagen wo mein Fehler liegt? Bin schon fast am verzweifeln...
lg, presswurst
Schon den ganzen Tag versuche ich eine IDT anzulegen, leider ohne Erfolg so dass ich mal Teile meines Codes hier poste, vllt findet ja jemand den Fehler:
Zuerst die Struktur (habe ich von http://www.osdev.org/wiki/IDT):
Code: [Auswählen]
#pragma pack(push,2)
struct idt {
unsigned short offset1;
unsigned short select;
unsigned char reserved;
unsigned char attr;
unsigned short offset2;
};
#pragma pack(pop)-- das pragma sollte alignment-bytes verhindern.Auf globaler Ebene habe ich einen Speicherbereich fuer die IDT reserviert (struct idt idt[256]).
Nun kommt die Funktion mit der ich einzelne IDT-Eintraege setze:
Code: [Auswählen]
void setidt(struct idt *idt, unsigned int offset) {
unsigned short codesel;
asm ("mov %%cs, %%ax\n\tmov %%ax, %0" : "=r" (codesel) :: "%eax");
idt->select = codesel;
idt->offset1 = offset & 0xffff;
idt->offset2 = (offset >> 16) & 0xffff;
idt->attr = 0x8e;
}(Man beachte dass es sich bei 'offset' um eine Adresse einer Funktion handelt)Ich habe mal einen Test-Eintrag erstellt:
Code: [Auswählen]
setidt(&idt[0x7f], (unsigned int)do_nothing);(do_nothing ist eine Funtion die nur eine Anweisung enthaelt: 'iret', daher kann der fehler als auch nicht kommen).
Als Letztes kommt noch eine Funktion um die IDT zu laden (void loadidt(struct idt*)):
Code: [Auswählen]
.globl _loadidt
_loadidt:
push %ebp
mov %esp, %ebp
mov 8(%ebp), %eax
mov %eax, (bas)
lidt (idts)
leave
ret
idts:
lim: .word 256*8-1
bas: .long 0Das Ausfuehren eines int 0x7f erzeugt folgenden Fehler:
00046832145e[CPU0 ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting
Kann mir vllt jemand sagen wo mein Fehler liegt? Bin schon fast am verzweifeln...

lg, presswurst

Übersicht
Wiki
Hilfe
Suche
Einloggen
Registrieren
Drucken

Gespeichert


