Autor Thema: Multitasking, die 1000ste ..  (Gelesen 11571 mal)

El-Tomato

  • Beiträge: 12
    • Profil anzeigen
Gespeichert
« Antwort #20 am: 06. October 2011, 16:36 »
Ich bin da nach dem Wiki Eintrag vorgegangen ..

Mittlerweile bin ich etwas weiter ..
Mein ASM Code ist einfach falsch.

Der sieht aktuell so aus:
irq_common_stub:

    pusha
    push ds
    push es
    push fs
    push gs

    mov ax, 0x10
    mov ds, ax
    mov es, ax
    mov fs, ax
    mov gs, ax

    push esp

    call _irq_handler

    pop ebx                ; Hier bin ich mir nicht
    mov esp, ebx         ; sicher, ob das richtig ist

    pop gs
    pop fs
    pop es
    pop ds
    popa
    add esp, 8

    iret

Jemand sagte mir, ich solle solle mich um den ESP kümmern und den auf den Wert einstellen, den er vor beladen
des Stacks (für die Parameter der C-Funktion) hatte ..
Aber wenn ich am Anfang den ESP auf den Stack pushe und direkt vor dem iret wieder ins esp poppe, tut sich einfach
überhaupt garnichts :/

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #21 am: 06. October 2011, 16:41 »
so war das schon richtig. Du willst ja den Stack nehmen der von irq_handler zurück kommt.

Du musst nur in deiner init_task die segment register ds, es, (fs, gs) mit (scheinbar) 16 initialisieren.
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

El-Tomato

  • Beiträge: 12
    • Profil anzeigen
Gespeichert
« Antwort #22 am: 06. October 2011, 16:49 »
ein pop fehlt aber trotzdem, oder? ich pushe ja vor dem call ESP auf den Stack..

Aber was meinst du mit "ds, es, fs und gs mit 16 initialisieren"? Einfach hart kodieren?
Weil im Code im Wiki werden diese Register auch mit 0 initialisiert .. die werden im wiki überhaupt nicht initialisiert ..

Hatte gerade die Idee, dass der zu große fs Wert auch durch die fehlende Initialisierung entstehen könnte ..
Habe jetzt jede Variable des structs mit 0 initialisiert, trotzdem bekomme ich einen GPF :/
« Letzte Änderung: 06. October 2011, 17:00 von El-Tomato »

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #23 am: 06. October 2011, 17:00 »
nein ein pop fehlt nicht, das brauchst du nur um den stack wieder herzustellen, aber du hast dir ja den stack den du wieder herstellen willst von vor dem 'push esp' gemerkt.

also du könntest zwar ein pop ebx machen, und dann esp mit eax überschreiben, aber das bringt dir nichts, weil dich der wert auf dem stack nicht interressiert und esp ja eh überschrieben wird.

im tutorial werden ds, es auch hard codiert, nur im assembler Teil(evtl. aber an der stelle auch noch gar nicht angefasst und erst später hard codiert).
Hardcodieren ist völlig inordnung wenn du FlatMemory nutzt. Für den anfang (nur KernelSpace/kein Userspace) muss da bei dir die 16 rein.
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

El-Tomato

  • Beiträge: 12
    • Profil anzeigen
Gespeichert
« Antwort #24 am: 06. October 2011, 17:07 »
Ick könnt dir knutschen, et funktioniert :D

Ich danke dir und Jidder schonmal recht herzlich :)


Für alle die es Interessiert oder die selben Probleme haben sollten, hier mein letzter Stand:

Der ASM IRQ-Stub:
irq_common_stub:

    pusha
    push ds
    push es
    push fs
    push gs

    mov ax, 0x10
    mov ds, ax
    mov es, ax
    mov fs, ax
    mov gs, ax

    push esp
    call _irq_handler

    mov esp, eax

    pop gs
    pop fs
    pop es
    pop ds
    popa
    add esp, 8

    iret

Das dazugehörige Struct im init_task() :
struct regs new_state = {
        .eax = 0,
        .ebx = 0,
        .ecx = 0,
        .edx = 0,
        .esi = 0,
        .edi = 0,
        .ebp = 0,
        //.esp = unbenutzt (kein Ring-Wechsel)
        .eip = (uint32_t) entry,
 
        /* Ring-0-Segmentregister */
        .cs  = 0x08,
        //.ss  = unbenutzt (kein Ring-Wechsel)
 
        /* IRQs einschalten (IF = 1) */
        .eflags = 0x202,

.gs=16,
.fs=16,
.es=16,
.ds=16,

.esp=0,
.useresp=0,
.ss=0,
.int_no=0,
.err_code=0,

    };

Danke, nochmals ;)

 

Einloggen