diff options
| author | Michal Idziorek <m.i@gmx.at> | 2014-11-27 01:44:25 +0100 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2014-11-27 01:44:25 +0100 |
| commit | e7b9569041521da7e0b67c30af7179c0af1e3738 (patch) | |
| tree | 4b7d596414afd96df0826f24e750c1defa14167b | |
| parent | 0e402637492f34a4d0e1302fbe34344e19bc4813 (diff) | |
struggling with new multitasking
| -rw-r--r-- | asm/int_clock_handler.asm | 5 | ||||
| -rw-r--r-- | kernel/config.h | 2 | ||||
| -rw-r--r-- | kernel/kernel.c | 6 | ||||
| -rw-r--r-- | kernel/syscalls.c | 88 | ||||
| -rw-r--r-- | kernel/syscalls.h | 3 | ||||
| -rw-r--r-- | kernel/task.c | 142 |
6 files changed, 62 insertions, 184 deletions
diff --git a/asm/int_clock_handler.asm b/asm/int_clock_handler.asm index c6c91fc..7e55067 100644 --- a/asm/int_clock_handler.asm +++ b/asm/int_clock_handler.asm @@ -1,8 +1,6 @@ global int_clock_handler [extern task_switch_next] -;CLOCK_COUNTER: -; db 0x00 [bits 32] int_clock_handler: @@ -20,8 +18,8 @@ int_clock_handler: ; mov byte [CLOCK_COUNTER], 0x00 pusha ;Push all standard registers - push esp ;Push pointer to all the stuff we just pushed + push esp ;Push pointer to all the stuff we just pushed call task_switch_next ;Call C code ;pop ebx @@ -30,7 +28,6 @@ pusha ;Push all standard registers ;cmp eax,ebx ;jne compare - mov esp, eax ;Replace the stack with what the C code gave us diff --git a/kernel/config.h b/kernel/config.h index fb68dec..4238578 100644 --- a/kernel/config.h +++ b/kernel/config.h @@ -8,7 +8,7 @@ #define FOOLOS_CONFIG_H #define FOOLOS_CONSOLE_AUTOBREAK // add newline automatically at end of line -#define FOOLOS_LOG_OFF // do not log anything +//#define FOOLOS_LOG_OFF // do not log anything #define FOOLOS_CONSOLE // otherwise VESA will be used! #define MEM_PRINT_MEMORYMAP #define LOG_BUF_SIZE 4069 diff --git a/kernel/kernel.c b/kernel/kernel.c index ed632c3..b03e3cd 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -67,7 +67,7 @@ void kernel_main(uint32_t initial_stack, int mp) // // Activate Virtual Memory (paging) // 0x8048000 is where user programms start! - vmem_init(); + //vmem_init(); // // init output to screen @@ -107,8 +107,8 @@ void kernel_main(uint32_t initial_stack, int mp) */ - // task_init(); - // while(1); + task_init(); + while(1); // load and run foolshell // we will come back into the kernel only on interrupts... diff --git a/kernel/syscalls.c b/kernel/syscalls.c index 765316b..585950d 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -72,7 +72,7 @@ typedef struct { } Elf32_Phdr; -static uint32_t alloc=0x900000; +static uint32_t alloc; int syscall_unhandled(int nr) { @@ -102,10 +102,9 @@ int syscall_write(int file, char *buf, int len) if(file!=1&&file!=2) panic(FOOLOS_MODULE_NAME,"unhandled syscall"); - // ALL output to stdout + //stderr and stdout go to console for(int i=0;i<len;i++) { - //PutConsoleChar(buf[i],0b1111111111000000); console_put_char_green(buf[i]); } return len; @@ -180,9 +179,14 @@ int syscall_readdir(const char *name,fs_dirent *dirs,int max) return fs_readdir(name,dirs,max); } +int syscall_fork() +{ +} int syscall_execve(char *name, char **argv, char **env) { + // watchout this is called with esp in virtual memory of running process! + #ifdef LOG_SYSCALLS log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"execve (name=0x%08X(%s), argvs=0x%08X, env=0x%08X)", name,name,argv,env); #endif @@ -190,74 +194,6 @@ int syscall_execve(char *name, char **argv, char **env) int inode_nr=ext2_filename_to_inode(EXT2_RAM_ADDRESS,name); if(inode_nr<1)return -1; -/* - char arg1[100]; - char arg2[100]; - char arg3[100]; - char arg4[100]; - char arg5[100]; - char *argvcopy[]={arg1,arg2,arg3,arg4,arg5}; - - int argc=0; - - if(argv!=NULL) - { - while(argv[argc]!=NULL) - { - //log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"arg at 0x%08X: %s", argv[argc],argv[argc]); - - int i=-1; - do{ - i++; - argvcopy[argc][i]=argv[argc][i]; - }while(argv[argc][i]!=0); - - argc++; - } - } - argvcopy[argc]=NULL; - - // - char *env1="PS1=$ "; - char *env2="PATH=/bin"; - char *env3="PWD=/home/miguel"; - char environstr[256]; - - char **oldenviron=env; - char **environ=0xf00001; - - if(oldenviron==0) - { - environ[0]=env1; - environ[1]=env2; - environ[2]=env3; - environ[3]=NULL; - } - else - { - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"environ: (0x%08X)",oldenviron); - int i=0; - int k=-1; - while(oldenviron[i]!=NULL) - { - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"copy env: %s (0x%08X)",oldenviron[i],oldenviron[i]); - int start=k+1; - int j=-1; - do{ - j++; - k++; - environstr[k]=oldenviron[i][j]; - }while(oldenviron[i][j]!=0); - - environ[i]=&environstr[start]; - i++; - } - - environ[i]=NULL; - } - - -*/ //TODO: load ELF binary and move this to own compilation unit //load binary @@ -300,7 +236,6 @@ int syscall_execve(char *name, char **argv, char **env) */ - // iterate over section headers for(int phidx=0;phidx<elf->e_phnum;phidx++) { @@ -372,7 +307,6 @@ int syscall_execve(char *name, char **argv, char **env) asm("ret"); // this is never reached! - } @@ -413,16 +347,13 @@ int syscall_isatty(int file,int none1,int none2) uint32_t syscall_sbrk(int incr, int none1, int none2) { - uint32_t oldalloc=alloc; alloc+=incr; #ifdef LOG_SYSCALLS log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"sbrk (incr=%d) = 0x%08X", incr,oldalloc); #endif - return oldalloc; - } @@ -432,6 +363,9 @@ int syscall_exit(int ret, char **env, int none2) log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"exit (ret=%d) (env=0x%08X)", ret, env); #endif + panic(FOOLOS_MODULE_NAME,"exit not supported yet" ); + + /* int i=0; while(env[i]!=NULL) { @@ -442,11 +376,11 @@ int syscall_exit(int ret, char **env, int none2) asm("mov $0x05bff,%esp"); // set stack pointer static char *argv[]={"shell","--silent",NULL}; syscall_execve("/bin/foolshell",argv,env); // start shell + */ } // stat, fstat, lstat - int syscall_stat(const char *path, struct stat *st,int none) { #ifdef LOG_SYSCALLS diff --git a/kernel/syscalls.h b/kernel/syscalls.h index fc5f5bf..d9a338d 100644 --- a/kernel/syscalls.h +++ b/kernel/syscalls.h @@ -32,12 +32,13 @@ #define SYSCALL_GETPID 78 int syscall_execve(char *name, char **argv, char **env); +int syscall_write(int file, char *buf, int len); + /* int syscall_readdir(const char *name,struct fs_dirent *dirs,int max); int syscall_exit(int ret, int none1, int none2); int syscall_open(char *name, int flags, int len); -int syscall_write(int file, char *buf, int len); int syscall_read(int file, char *buf, int len); int syscall_close(int file,int none1,int none2); int syscall_fstat(int file, struct stat *st,int none); diff --git a/kernel/task.c b/kernel/task.c index 08301cf..620977e 100644 --- a/kernel/task.c +++ b/kernel/task.c @@ -14,75 +14,27 @@ #include "fs/ext2.h" #define FOOLOS_MODULE_NAME "task" -int started; -static volatile int c1,c2,c3; -void task_test1() -{ - // simple built-in shell - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"spawning build-in shell"); - - while(1) - { - - char c; - if(ringbuffer_get(&c)) - { - console_put_char_white(c); - } - } - - /* - c1++; - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"task 1 progress: %d", c1); - sleep(2); - */ - - - -} +#define MAX_TASKS 10 -void task_test2() -{ - while(1) - { - c2++; - //log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"task 2 progress: %d", c2); -// sleep(2); - - } +static volatile int current_task=-2; -} - -void task_test3() +static volatile struct task_list_struct { - while(1) - { - c3++; -// log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"task 3 progress: %d", c3); -// sleep(2); - } - -} - -////////////// -// -typedef struct{ //Simple structure for a thread - unsigned int esp0; //Stack for kernel - unsigned int esp3; //Stack for process -} Thread; - - -Thread Threads[3]; //Space for our simple threads. -volatile int CurrentTask; //The thread currenlty running (-1 == none) + bool active; + uint32_t esp; // stack pointer of the task; + uint32_t vmem; // number of virtual memory table to switch to + +}task_list[MAX_TASKS]; void task_create(int pid,void(*thread)()) { unsigned int *stack; - Threads[pid].esp0 = pmmngr_alloc_block(); - stack = (unsigned int*)Threads[pid].esp0+4095; //This makes a pointer to the stack for us + task_list[pid].esp = pmmngr_alloc_block(); + stack = (unsigned int*)task_list[pid].esp+4095; //This makes a pointer to the stack for us + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"new task: stack: 0x%08X thread: 0x%08X", stack, thread); //First, this stuff is pushed by the processor @@ -108,60 +60,54 @@ void task_create(int pid,void(*thread)()) *--stack = 0x10; //GS */ - Threads[pid].esp0 = (uint32_t)stack; //Update the stack pointer - + task_list[pid].esp = (uint32_t)stack; //Update the stack pointer + task_list[pid].active=true; }; +// this gets called by our clock interrupt regularly! uint32_t task_switch_next(uint32_t oldesp) { + timer_tick(); - //console_put_char('.'); - timer_tick(); - if(started!=0xabcde) return oldesp; - if(CurrentTask!=-1)Threads[CurrentTask].esp0=oldesp; - - CurrentTask++; - if(CurrentTask>2)CurrentTask=0; - - /* - log( - FOOLOS_MODULE_NAME, - FOOLOS_LOG_INFO, - "oldesp: 0x%08X saved / next task: %d (esp: 0x%08X) ", - oldesp, - CurrentTask, - Threads[CurrentTask].esp0); - -// return oldesp; -// */ - - return Threads[CurrentTask].esp0; //Return new stack pointer to ASM -} + if(current_task==-2)return oldesp; + if(current_task!=-1)task_list[current_task].esp=oldesp; -void stack_trace(uint32_t *stack,int size) -{ - for(int i=size;i>=0;i--) + for(int i=0;i<MAX_TASKS;i++) { - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"stack: 0x%08X -> 0x%08X", stack, *stack); - stack++; + int pid=(current_task+1+i)%MAX_TASKS; // schedule round robin style + if(task_list[pid].active) + { + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"switch from %d to pid: %d (0x%08X)", current_task,pid,task_list[pid].esp); + current_task=pid; + return task_list[pid].esp; + } } -} - -void task_init() -{ + // if no task found retunr the old esp + return oldesp; +} - CurrentTask=-1; +volatile int c1,c2; - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"init multitasking."); - task_create(0,task_test1); - task_create(1,task_test2); - task_create(2,task_test3); - started=0xabcde; +volatile void test1() +{ + c1++; + // syscall_write(1,">",1); } +volatile void test2() +{ + c2++; + // syscall_write(1,"<",1); +} +void task_init() +{ + task_create(1,test1); + task_create(2,test2); + current_task=-1; +} |
