Autor Thema: Die IDT will nich so wie ich  (Gelesen 5597 mal)

mwoidt

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« 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?

traexx

  • Beiträge: 6
    • Profil anzeigen
    • http://home.dp-world.net
Gespeichert
« Antwort #1 am: 09. June 2004, 17:41 »
hast du die Funktion vidmemprint überprüft? die muss den richtigen Datensegment-Deskriptor erhalten, damit die Ausgabe funktioniert. Wofür war int 0 noch mal? Hast du den Interrupt mal als Assemblerroutine probiert?

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #2 am: 09. June 2004, 17:55 »
Nur so ein Tip am Rande.

Gerade bei solchen Strukturen bei denen die korrekte Größe sehr wichtig ist, würde ich in ASM arbeiten.

Der C-Compiler macht meistens bei einer Struktur mit mehreren Elemente ein sog. Data Alignment. Das heisst er fügt manchmal "Null"-Bytes zwischen den Elementen ein, damit diese an gewisse Speicheradressen ausgerichtet sind.

Bei dieser Struktur sollte es zwar gehen, aber besser du weist das zumindest :)

Das kann nämlich unauffindbare Fehler herbeiführen :)
----------------------
Redakteur bei LowLevel

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #3 am: 09. June 2004, 20:04 »
Also ich würd auch die idt in ASM erstellen und dann aus C mit Pointern darauf arbeiten, ansonsten kannst du bei der Definition der Struktur
__attribute__ ((packed)) angeben, das bewirkt das die im Speicher hintereinander steht
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

 

Einloggen