Also ich machs im Prinzip genauso, mein Scheduler läuft auch im Kernelring, macht aber nix, hab den direkt in den Int eingecodet. Wasich da noch einbaun muss wäre die Sicherung der der FloatingPoint Register, und das mit dem Paging innerhalb des Schedulers müsste auch noch, hab aber so bisher keine Probleme bekommen. Ne kleine Prioriätsverwaltung steckt auch mit drin. Hier mal der Code:
_Taskhandler:
push eax
push ebx
push ecx
push edx
push edi
push esi
push ebp
push ds
push es
push fs
push gs
pushfd
mov eax,cr3
push eax
mov ax,0x10
mov ds,ax
mov ecx,[_TaskManCurrentTaskID]
mov eax,ecx
shl eax,3
mov bl,[eax+1]
or bl,bl
jz .nexttask
dec bl
mov [eax+1],bl
jmp .execnexttask
.nexttask:
mov [eax+4],esp
mov bx,ss
mov [eax+2],bx
mov bl,[eax]
mov [eax+1],bl
mov edx,[_MaxTaskID]
.seeknexttask:
cmp ecx,edx
jnle .neu
add eax,8
inc ecx
mov bl,[eax]
or bl,bl
jz .seeknexttask
dec bl
mov [eax+1],bl
mov esp,[eax+4]
mov bx,[eax+2]
mov ss,bx
mov [_TaskManCurrentTaskID],ecx
jmp .execnexttask
.neu:
push 1
pop ecx
mov eax,8
jmp .seeknexttask
.execnexttask:
pop eax
mov cr3,eax
popfd
pop gs
pop fs
pop es
pop ds
pop ebp
pop esi
pop edi
pop edx
pop ecx
pop ebx
mov al,0x20
out 0x20,al
pop eax
iret
Die Tabelle für die Tasks liegt bei 0x0. der erste Eintrag ist ein 0-Eintrag.
Ein Eintrag für die tasktabelle sieht so aus:
db Priorität_general
db Priotität_aktuell ;wird runtergezählt
dw _ss
dd _esp ; für den Stackrahmen des Prozesses
falls was unklar ist fragt halt