#include "scheduler.h" #include "kernel.h" #include "gdt.h" #include "mem.h" #include "fs/elf.h" #include "asm_x86.h" #include "asm_task.h" #include "asm_usermode.h" #include "kmalloc.h" #include "vmem.h" #include "syscalls.h" #include "fs/fs.h" #include "fs/ext2.h" #define NO_TASK 0xffffffff static volatile uint32_t current_task=NO_TASK; // TODO: per cpu! static volatile struct task_list_struct { volatile bool active; // is this slot used (Y/N) volatile uint32_t pid; // process id (TODO) volatile uint32_t parent; // parent process id volatile uint32_t esp; // stack pointer of the task volatile uint32_t esp0; // tss.esp0 volatile struct pdirectory *vmem; // number of virtual memory table volatile uint32_t brk; // memory brk pos volatile bool wait; // waiting for syscall to be processed. volatile uint32_t eax; volatile uint32_t ebx; volatile uint32_t ecx; volatile uint32_t edx; }task_list[MAX_TASKS]; volatile int task_reset(uint32_t pid, uint32_t entry, uint32_t stack) { uint32_t *stk=task_list[pid].esp; stk[14]=entry; stk[17]=stack; return 1; } volatile int add_task(uint32_t parent,uint32_t vmem) { for(int i=0;i-1) { int pid=force_pid; current_task=pid; install_tss(0,task_list[pid].esp0); x86_set_page_directory(task_list[pid].vmem); return task_list[pid].esp; } for(int i=0;i [%d] (free blocks remaining: %d )", pid, ret,0); return ret; } volatile uint32_t task_clone(uint32_t pid) { //TODO: what will happen if we get rescheduled!?!?! int ret=add_task(pid,vmem_new_space_dir(task_list[pid].vmem,true)); klog("[%d] cloned -> [%d] (free blocks remaining: %d )", pid, ret,0); return ret; } // init task (root of all other tasks / processes) // volatile void scheduler_init(void *dir) { for(int i=0;i