having a problem with my multitasking system
Posted: Fri Nov 09, 2007 10:50 pm
so after reading about TSS for about an hour and then deciding that it was too complex for me, i decided to make my own simple multitasking system
here is task.h
my TASK structure
here's my main
my init_tasks function
now when i run my OS i get an Invalid opcode exception, but don't see anything in the code that would cause this.
here is task.h
Code: Select all
#include "types.h"
#include "error.h"
#define MAX_TASKS 10
struct TASK tasks[MAX_TASKS];
int current_task=0;
int running_task=0;
void new_task(void *function)
{
if(current_task==10)
{
kerror(ERROR_NO_TASK_SPACE);
}
else
{
tasks[current_task].eip=(unsigned int)&function;
asm("mov %%eax, %0"::"g"(tasks[current_task].eax));
asm("mov %%ebx, %0"::"g"(tasks[current_task].ebx));
asm("mov %%ecx, %0"::"g"(tasks[current_task].ecx));
asm("mov %%edx, %0"::"g"(tasks[current_task].edx));
asm("mov %%esp, %0"::"g"(tasks[current_task].esp));
asm("mov %%esi, %0"::"g"(tasks[current_task].esi));
asm("mov %%edi, %0"::"g"(tasks[current_task].edi));
asm("mov %%ss, %0"::"g"(tasks[current_task].ss));
asm("mov %%es, %0"::"g"(tasks[current_task].es));
asm("mov %%gs, %0"::"g"(tasks[current_task].gs));
asm("mov %%fs, %0"::"g"(tasks[current_task].fs));
asm("mov %%cs, %0"::"g"(tasks[current_task].cs));
asm("mov %%ds, %0"::"g"(tasks[current_task].ds));
asm("pushfl");
asm("pop %eax");
asm("mov %%eax, %0"::"g"(tasks[current_task].eflags));
if(current_task==0)
{
tasks[current_task].esp+=(sizeof(long)*100);
}
else
{
tasks[current_task].esp+=(sizeof(long)*100)+tasks[current_task-1].esp;
}
current_task++;
}
}
void switch_task(void)
{
if(running_task==10) running_task=-1;
running_task++;
if(tasks[running_task].eip!=0)
{
asm("push %0":"=g"(tasks[running_task].eflags));
asm("popfl");
asm("mov %0, %%eax":"=g"(tasks[running_task].eax));
asm("mov %0, %%ebx":"=g"(tasks[running_task].ebx));
asm("mov %0, %%ecx":"=g"(tasks[running_task].ecx));
asm("mov %0, %%edx":"=g"(tasks[running_task].edx));
asm("mov %0, %%edi":"=g"(tasks[running_task].edi));
asm("mov %0, %%esi":"=g"(tasks[running_task].esi));
asm("mov %0, %%esp":"=g"(tasks[running_task].esp));
asm("mov %0, %%ebp":"=g"(tasks[running_task].ebp));
asm("mov %0, %%ss":"=g"(tasks[running_task].ss));
asm("mov %0, %%gs":"=g"(tasks[running_task].gs));
asm("mov %0, %%fs":"=g"(tasks[running_task].fs));
asm("mov %0, %%cs":"=g"(tasks[running_task].cs));
asm("mov %0, %%ds":"=g"(tasks[running_task].ds));
asm("jmp %0":"=g"(tasks[running_task].eip));
}
}
Code: Select all
struct TASK
{
unsigned int gs;
unsigned int fs;
unsigned int ds;
unsigned int ss;
unsigned int cs;
unsigned int es;
unsigned int edi;
unsigned int esi;
unsigned int ebp;
unsigned int esp;
unsigned int ebx;
unsigned int edx;
unsigned int ecx;
unsigned int eax;
unsigned int eflags;
unsigned int eip;
};
Code: Select all
void _main(void* mbd,unsigned int magic)
{
idt_install();
gdt_install();
clrscr(BLACK,BLACK);
set_color(WHITE,BLACK);
set_echo(1);
Put("Welcome to PyroS\n");
init_tasks();
}
Code: Select all
void main_loop(void)
{
for(;;);
}
void init_tasks(void)
{
new_task((void*)main_loop);
}