1
Lowlevel-Coding / Die IDT will nich so wie ich
« am: 09. June 2004, 16:25 »
moinmoin.
Ich wollte mal eine IDT aus c code heraus anlegen. Der PM läuft bereits und ich hab diesen Code geschrieben (ich habn segment, dass bei 0x00 anfängt)
Erstmal eine struct, die einen Selektor verkörpern soll
struct IDT_desc
{
short offset0_15;
short selektor;
char unused;
char P_DPL_TYPE;
short offset16_31;
};
Das dürfte soweit eindeutig sein.
dann als nächstes hab ich ein Pointer auf eine solche struktur erstellt und ihn nach 0x800 gucken lassen. Da soll die Tabelle später mal hin
struct IDT_desc IDT = 0x800;
Dann eine Funktion die später als interrupt handler aufgerufen werden soll. Dann noch eine, die den deskriptor einträgt
void testint ()
{
vidmemprint ("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"); //Diese Funktion schreibt den String ins videomommory
__asm__("iret");
};
void set_idt (void)
{
int offset = (int) &testint; //Die Adresse des Handlers in eine Variable kopieren
short value = (offset << 16)>>16; //nur den hinteren Teil der Adresse in value kopieren
IDT[0].offset0_15 = value; //die ersten 15 bit setzen
value = offset >> 16; //nur den vorderen Teil des offsets betrachten
IDT[0].offset16_31 =value;
IDT[0].selektor = 0x08; //das codesegment ist das erste der GDT
IDT[0].P_DPL_TYPE = 0xAF;
idtset();
}
Die Funktion idtset ist in asm geschrieben und macht folgendes:
_idtset:
max dw 0x7ff ;255 Slots
dd 0x800 ;Offset
LIDT [max] ;IDT laden
int 0 ;mal den int 0 ausprobieren. Dabei stürzt er ab
ret
Kann mir jemand sagen, was ich falsch mache?
Ich wollte mal eine IDT aus c code heraus anlegen. Der PM läuft bereits und ich hab diesen Code geschrieben (ich habn segment, dass bei 0x00 anfängt)
Erstmal eine struct, die einen Selektor verkörpern soll
struct IDT_desc
{
short offset0_15;
short selektor;
char unused;
char P_DPL_TYPE;
short offset16_31;
};
Das dürfte soweit eindeutig sein.
dann als nächstes hab ich ein Pointer auf eine solche struktur erstellt und ihn nach 0x800 gucken lassen. Da soll die Tabelle später mal hin
struct IDT_desc IDT = 0x800;
Dann eine Funktion die später als interrupt handler aufgerufen werden soll. Dann noch eine, die den deskriptor einträgt
void testint ()
{
vidmemprint ("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"); //Diese Funktion schreibt den String ins videomommory
__asm__("iret");
};
void set_idt (void)
{
int offset = (int) &testint; //Die Adresse des Handlers in eine Variable kopieren
short value = (offset << 16)>>16; //nur den hinteren Teil der Adresse in value kopieren
IDT[0].offset0_15 = value; //die ersten 15 bit setzen
value = offset >> 16; //nur den vorderen Teil des offsets betrachten
IDT[0].offset16_31 =value;
IDT[0].selektor = 0x08; //das codesegment ist das erste der GDT
IDT[0].P_DPL_TYPE = 0xAF;
idtset();
}
Die Funktion idtset ist in asm geschrieben und macht folgendes:
_idtset:
max dw 0x7ff ;255 Slots
dd 0x800 ;Offset
LIDT [max] ;IDT laden
int 0 ;mal den int 0 ausprobieren. Dabei stürzt er ab
ret
Kann mir jemand sagen, was ich falsch mache?