Nabend zusammen,
ich habe ein für mich unerklärliches Problem.
Nachdem ich nun Multitasking implementiert habe, wollte ich das ganze mal testen.
Nach der erfolgreichen Initialisierung wird eine Division by Zero Exception von meinem System gefunden.
Wenn ich allerdings die Interrupts abschalte, dann passiert nichts.
Müsste dann nicht Qemu ein Problem finden?
Habe in meinem Code auch keinen Fehler gefunden.
Die Excpetion wird auch erst nach dem Bootvorgang geworfen, wenn der Kernel in einer Endlosschleife läuft.
Woran kann das liegen?
PS:
Könnte es sein, dass TSS falsch gesetzt wurde?
Hier mal der Code:
gdt_set_gate(3, (uint32_t)&krn_tss, (uint32_t)(&krn_tss + sizeof(tss_t)), 0x89, 0xCF);
gdt_update();
// create the kernel-interrupt-stack
uint32_ptr krn_stack = (uint32_ptr)((uint32_t)alloc_kernel(1) + 4096);
*--krn_stack = 0x0202; //EFLAGS
*--krn_stack = 0x08; //CS
*--krn_stack = (uint32_t)int_dispatcher; //EIP
*--krn_stack = 0; //EDI
*--krn_stack = 0; //ESI
*--krn_stack = 0; //EBP
*--krn_stack = 0; //Just an offset, no value
*--krn_stack = 0; //EBX
*--krn_stack = 0; //EDX
*--krn_stack = 0; //ECX
*--krn_stack = 0; //EAX
// data segments pushed by IRQ handler
*--krn_stack = 0x10; //DS
*--krn_stack = 0x10; //ES
*--krn_stack = 0x10; //FS
*--krn_stack = 0x10; //GS
krn_tss.ss0 = SYSTEM_DATA_SELECTOR;
krn_tss.esp0 = (uint32_t)krn_stack;
Stimmt daran was nicht?
int_dispatcher ist eine Funktion, die direkt nach der Int-No-Feststellung und der Erstellung des CPU-Image aufgerufen wird und dann entscheided, ob es ein ISR/IRQ/Syscall ist und den dementsprechenden Handler aufruft.