Ich versuch ja Multitasking in mein OS einzubauen.
Jedoch habe ich es immer noch nicht hin bekommen. Bei den Tabellen bin ich mir eigentlich sicher das sie richtig sind. Somit müsste der Fehler im Taskwechsel also im Timer Interrupt liegen. Und hier ist dann der Code:
IRQ_32:
pushad
push ds
cli
mov al, 0x20 ;EOI-Wert in AL ablegen
out 0x20, al ;EOI an Master-PIC senden
mov ax, 2
shl ax, 3
mov ds, ax
mov al, [status+0x10000]
and al, 1 ;Multitasking ?
jz nicht_mt
;task wechsel anfang
push eax
push esi
add dword [tasking_current+0x10000], 6 ;wert des aktuellen Tasks überspringen
mov esi, [tasking_end+0x10000] ;task-Tabelle-Ende laden
cmp esi, [tasking_current+0x10000] ;mit Position des zu ladenden Tasks vergleichen
jne scheduler_no_resetting ;falls nicht gleich, also das Ende noch nicht erreicht ist springen
mov dword [tasking_current+0x10000], tss_tabele +0x10000 ;Wie am Anfang
scheduler_no_resetting:
; hier haben wir in "Tasking_current" die Adresse der Daten des zu ladenen Tasks
mov esi, [tasking_current+0x10000]
add esi, 0x10002 ;auf richtige Adresse
push es
mov ax, 2
shl ax, 3
mov es, ax
lodsw
pop es
pop esi
push edi
mov edi,tss_switch_label
add edi, 5
add edi, 0x10000
push es
push ax
mov ax, 2
shl ax, 3
mov es, ax
pop ax
stosw
pop es
tss_switch_label:
jmp dword 0x1234:0x12345678
pop edi
pop eax
nicht_mt:
sti
pop ds
popad
iretd
(das erste Bit von âstatusâ benutze ich um Multitasking laufen zu lassen)
(Code beginnt ab 0x10000 Code- & Daten- desc. Von 0 â 4GB)
Worin liegt der Fehler oder ist doch alles richtig und es liegt vielleicht doch an einer Tabelle?