// http://hosted.cjmovie.net/TutMultitask.htm // // #include "kernel.h" #include "mem.h" #include "asm/x86.h" #include "vmem.h" #include "syscalls.h" #include "fs/fs.h" #include "fs/ext2.h" static volatile int volatile current_task=-1; static volatile struct task_list_struct { volatile int parent; volatile bool active; volatile uint32_t esp; // stack pointer of the task; volatile pdirectory *vmem; // number of virtual memory table to switch to volatile bool waiting; volatile bool skipwait; volatile uint32_t brk; volatile uint32_t esp0; }volatile task_list[MAX_TASKS]; volatile int add_task(uint32_t esp, uint32_t vmem) { for(int i=0;i [%d] (free blocks remaining: %d )", current_task, pid,mem_get_free_blocks_count()); return pid; } // init task (root of all other tasks / processes) // volatile void scheduler_init(pdirectory *dir) { current_task=0; // this is our main user task on slot 0 task_list[0].parent=0; task_list[0].active=true; task_list[0].waiting=false; task_list[0].vmem=dir; task_list[0].esp = kballoc(4)+4*4096; task_list[0].esp0 = kballoc(4)+4*4096; task_list[1].parent=0; task_list[1].active=true; task_list[1].waiting=false; task_list[1].vmem=dir; task_list[1].esp = kballoc(4)+4*4096; task_list[1].esp0 = 0; // not needed by kernel space tasks task_pusha(task_list[1].esp); task_pusha(task_list[0].esp); // finally enable interrrupts so the scheduler is called (by timer) x86_sti(); // loop until scheduler kicks in and reschedules us... while(1); } volatile int task_get_current_pid() { return current_task; } volatile uint32_t task_get_brk() { return task_list[current_task].brk; } volatile void task_set_brk(uint32_t brk) { task_list[current_task].brk=brk; }