Autor Thema: IDT  (Gelesen 4905 mal)

N43

  • Beiträge: 8
    • Profil anzeigen
Gespeichert
« am: 16. December 2005, 14:50 »
IDT
Hallo,

mein Kernel befindet sich im Protected Mode und Paging ist aktiv. Das laden der IDT funktioiert auch, jedoch greift er beim Aufruf eines Interrupts auf den falschen Speicherbereich zu.

Der Segmentdeskriptor hat die Basisadresse 0xC0000000, die ersten 4MB des physikalen Speichers habe ich an diese Stelle gemapped. Sobald ich die ersten 4MB auch an die ersten 4MB des virtuellen Speichers mappe funktionieren die Interrupts.

Mit dem folgendem Code richte ich einen Interrupt ein.void setup_int(short number, void (*handler)(), char debug)
{
unsigned long offset = (unsigned long) handler;

unsigned short selector;
asm volatile("movw %%cs, %0" : "=g"(selector));

// set actual values of int
idt[number].low_offset   = (offset & 0xFFFF);
idt[number].selector     = selector;
idt[number].settings     = 0x8E00;
idt[number].high_offset  = (offset >> 16);

if (debug)
{
ltoh(selector); k_printf("\n");
ltoh(offset); k_printf("\n");
ltoh(idt[number].low_offset); k_printf("\n");
ltoh(idt[number].high_offset); k_printf("\n");
}

}


Wenn ich mir die Werte mittels dem debug-Flag ausgeben lasse, stimmen sie alle.

Woran könnte es liegen, dass die Basisadresse des Deskriptors nicht berücksichtigt wird?

N43

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 16. December 2005, 16:33 »
IDT
GCC ist darauf ausgelegt, in einem flachen Speichermodell zu arbeiten. (Alle Descriptoren sollten Basis 0 und Limit 0xFFFFFFFF haben) Wenn das nicht so ist, werden die Addressen vom Linker falsch berechnet. Warscheinlich würde es funtionieren, wenn du den Code an die Stelle 0 linkst, den Descriptor auf deinen gewünschten Wert setzt, und dann den Code an Offset 0 lädst/mappst. Ich würde dir aber trotzdem empfehlen, ein flaches Speichermodell zu benutzen, und nicht mit irgentwelche "Hacks" GCC dazu zu veranlassen, den Code richtig zu kompilieren.

N43

  • Beiträge: 8
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 16. December 2005, 16:56 »
IDT
Hallo,

den Code habe ich ans erste MB gelinkt, starte dann das System auch mit der Basisadresse 0. Nachdem ich Paging aktiviert habe lade ich die GDT neu.

Die Adressen muessten eigentlich richtig vom Linker berechnet werden und an den Offsets aendert sich ja nichts, wenn ich die ersten 4MB des physischen Speichers ans 3GB mappe und den Deskriptor entsprechend anpasse.

N43

 

Einloggen