From b9f10c8a65a24db1c6a52d9df67230b75fa38d1a Mon Sep 17 00:00:00 2001 From: Miguel Date: Thu, 13 Sep 2018 03:12:12 +0200 Subject: inside the scheduler --- kernel/scheduler.c | 63 ++++++++++++++++++++---------------------------------- 1 file changed, 23 insertions(+), 40 deletions(-) (limited to 'kernel/scheduler.c') diff --git a/kernel/scheduler.c b/kernel/scheduler.c index 985b3bf..541eb15 100644 --- a/kernel/scheduler.c +++ b/kernel/scheduler.c @@ -12,12 +12,24 @@ #include "kmalloc.h" #include "vmem.h" +#include "spinlock.h" #include "syscalls.h" #include "fs/fs.h" #include "fs/ext2.h" #define NO_TASK 0xffffffff +static volatile uint32_t pid=1; + +uint32_t nextPID() +{ + spinlock_spin(SPINLOCK_PID); + uint32_t ret=pid; + pid++; + spinlock_release(SPINLOCK_PID); + return ret; +} + // we hold this stuff per cpu static volatile uint32_t current_task[SMP_MAX_PROC]; @@ -56,6 +68,7 @@ volatile void scheduler_init(uint32_t cpu, void *dir) // this is our main kernel task at slot 0 (per cpu) task_list[cpu][0].parent=0; + task_list[cpu][0].pid=nextPID(); task_list[cpu][0].active=true; task_list[cpu][0].wait=false; task_list[cpu][0].vmem=dir; @@ -66,6 +79,7 @@ volatile void scheduler_init(uint32_t cpu, void *dir) // this is our main kernel task at slot 0 (per cpu) task_list[cpu][1].parent=0; + task_list[cpu][1].pid=nextPID(); task_list[cpu][1].active=true; task_list[cpu][1].wait=false; task_list[cpu][1].vmem=dir; @@ -159,7 +173,9 @@ volatile int add_task(uint32_t parent,uint32_t vmem) { if(task_list[cpu][i].active!=true) { - task_list[cpu][i].parent=parent; + task_list[cpu][i].pid=nextPID(); + + task_list[cpu][i].parent=task_list[cpu][parent].pid; task_list[cpu][i].vmem=vmem; task_list[cpu][i].esp = kballoc(4)+2*4096; // center @@ -211,29 +227,19 @@ void task_syscall_worker() task_list[cpu][0].vmem=task_list[cpu][i].vmem; // switch syscall worker to pagedir of calling userprog x86_set_page_directory(task_list[cpu][0].vmem); - if(task_list[cpu][i].eax==SYSCALL_WAIT) - { - continue; - } - - if(task_list[cpu][i].eax==SYSCALL_READ) - { - uint32_t ok= chk_syscall_read( - task_list[cpu][i].edx, - task_list[cpu][i].ecx, - task_list[cpu][i].ebx - ); - if(!ok)continue; - } - nowork=false; - uint32_t ret= syscall_generic(task_list[cpu][i].eax, + uint32_t ret = syscall_generic(task_list[cpu][i].eax, task_list[cpu][i].edx, task_list[cpu][i].ecx, task_list[cpu][i].ebx, i); + if(task_list[cpu][i].eax==SYSCALL_WAIT) + { + continue; + } + uint32_t *stack=task_list[cpu][i].esp; stack[12]=0x1; stack[13]=ret; @@ -261,29 +267,6 @@ volatile uint32_t task_syscall(uint32_t eax,uint32_t ebx, uint32_t ecx, uint32_t return 1; } -//TODO: free vmem too! -//TODO: notify waiting parent when child finished; -volatile uint32_t task_exit(uint32_t pid) -{ - uint32_t cpu=smp_get(SMP_APIC_ID); - task_list[cpu][pid].active=false; - int parent_pid=task_list[cpu][pid].parent; - if(task_list[cpu][parent_pid].wait&&task_list[cpu][parent_pid].eax==SYSCALL_WAIT) - task_list[cpu][parent_pid].wait=false; - klog("[%d] exit", pid); -// vmem_free_dir(task_list[cpu][pid].vmem); - return 1; -} - -volatile uint32_t task_wait(uint32_t pid) -{ - uint32_t cpu=smp_get(SMP_APIC_ID); - klog("[%d] wait", pid); - task_list[cpu][pid].wait=true; - task_list[cpu][pid].eax=SYSCALL_WAIT; - return 1; -} - volatile uint32_t task_fork(uint32_t pid) { uint32_t cpu=smp_get(SMP_APIC_ID); -- cgit v1.2.3