// http://hosted.cjmovie.net/TutMultitask.htm // // #include "kernel.h" #include "lib/logger/log.h" // logger facilities #include "lib/buffer/ringbuffer.h" #include "mem.h" #include "timer.h" #include "console.h" #include "x86.h" #include "vmem.h" #include "syscalls.h" #include "fs/fs.h" #include "fs/ext2.h" #define FOOLOS_MODULE_NAME "task" #define MAX_TASKS 10 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 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; } char *argv_init[]={"/bin/init",NULL}; char *env_init[]={NULL}; // init task (root of all other tasks / processes) // volatile void task_init(pdirectory *dir) { // this is our main 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 = 0; // will be set by next task_switch_next() call. current_task=0; syscall_execve("/bin/init",argv_init,env_init); //syscall_execve("/bin/foolshell",argv_init,env_init); // syscall_execve("/bin/tput",argv,env); } 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; }