Page 1 of 1
Multi-taskin?
Posted: Tue Feb 15, 2005 4:14 pm
by Justmin
As far as I have understand, I can use the timer-interrupt for multitasking? My problem is, suppose I have the EIP/All registers stored for a thread. Then I would like to fill the registers with the correct values, no problem. But how do I set the EIP to a special address and then how do I start to execute from there?
Re:Multi-taskin?
Posted: Tue Feb 15, 2005 5:50 pm
by B.E
When an interrupt is called the cpu pushes the following in order:
EFLAGS
CS
EIP
So to modify the retern address pop EIP and CS off the stack and push CS and newEIP onto the stack.
Code: Select all
Timer_handler:
...
pop oldEIP
pop oldCS
push newCS ; now when we retern CS = NewCS
push newEIP; now when we retern EIP = NewEIP
IRET
there are other ways of task switching. if you haven't yet read the manuals. you can get them from intel
Re:Multi-taskin?
Posted: Tue Feb 15, 2005 7:01 pm
by oswizard
Instead, if your interrupt handler saves all registers (which it must do anyways) simply store an ESP value for each task. Have your timer handler push a return address onto the current stack, switch stacks, and then execute a ret instruction. This will pop the return address off of the new stack. Have a routine such as this one, from my older OS, in Microsoft C++ (pardon me for not using *nix
):
Code: Select all
EXTERN void TmSwitchTo(IThread *pThreadCur, IThread *pThreadNew)
{
__asm push esi;
__asm push edi;
__asm push ebp;
__asm mov ecx, pThreadCur; // ECX = current thread
__asm mov edx, pThreadNew; // EDX = new thread
__asm mov dword ptr [ecx]IThread.SaveESP, esp;
__asm mov dword ptr [ecx]IThread.SaveEIP, offset tsret;
__asm mov esp, dword ptr [edx]IThread.SaveESP;
__asm push dword ptr [edx]IThread.SaveEIP;
__asm jmp TmSwitchTo2; // FASTCALL (cur ECX, new EDX)
tsret:
__asm pop ebp;
__asm pop edi;
__asm pop esi;
}
EXTERN void __fastcall TmSwitchTo2(IThread *pThreadCur, IThread *pThreadNew)
{
// Code here will be called each time a task switches.
// This would be a good place to switch CR3, etc.
}
I think this is something like what *nix does, but I am not sure. Anyways, this seems to work for me.
Good luck,
Mike
Re:Multi-taskin?
Posted: Tue Feb 15, 2005 8:58 pm
by Dex4u
Here is a simple example of multitasking, that fits in the boot sector of a floppy, less than 512 bytes, its for realmode, but may help ?.
http://512.decard.net/entries/nanoos2.zip
PS: It was a entry in the 512b compo.