Autor Thema: Division by Zero fällt Qemu nicht auf  (Gelesen 2856 mal)

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« am: 17. April 2009, 23:20 »
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.
« Letzte Änderung: 17. April 2009, 23:30 von rizor »
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

rizor

  • Beiträge: 521
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 08. May 2009, 01:09 »
Nabend,

ich habe mal eine Frage zum krn_stack.
Was für eine funktion muss ich eintragen zur Behandlung eines Interrupts.
Die Methode Int_Dispatcher ist eine Methode die aufgerufen wurde, nachdem die register gesichert wurde und die int-no festgestellt wurde.
Muss es eine Methode sein, bevor die register gesichert wird?

Mein Behandlung sieht wie folgt aus:
Interrupt->isr_xx oder irq_xx (int-no feststellen)->isr_common oder irq_common (register sichern)->int_dispatcher->Bahandlung

Welche Methode muss ich angeben, damit es richtig im tss steht?
Programmiertechnik:
Vermeide in Assembler zu programmieren wann immer es geht.

AcidIO

  • Beiträge: 11
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 12. May 2009, 15:10 »
Wie meinst du die Frage?
Soweit ich weiß wird doch bei einem IRQ oder einem Interrupt die in der IDT gespeicherte Methode genommen.
Wer nichts wagt kann nichts verlieren...

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #3 am: 12. May 2009, 15:51 »
Welche Methode muss ich angeben, damit es richtig im tss steht?
Es erscheint mir Schwachsinn einen erstellten Task in einer int_dispatcher Routine zu starten, und dann auch noch ohne den Stack herzustellen, der in einer int_dispatcher Routine (wahrscheinlich) herrschen sollte.
Was soll den dein Task ausführen? Wie wärs wenn du EIP dann auch an die Stelle legst?
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

 

Einloggen