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):
#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:
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:
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*)):
.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 0
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