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