diff options
| author | Miguel <m.i@gmx.at> | 2018-09-28 11:13:06 +0200 |
|---|---|---|
| committer | Miguel <m.i@gmx.at> | 2018-09-28 11:13:06 +0200 |
| commit | 5f6c2bcf0d2f9c416134aba224d90a605f216818 (patch) | |
| tree | 6fda812ecd1ce06f743c292f3d0495d0b2941bbd /kernel | |
| parent | 4ddca59e2c07a98988ffb07571d2b35c4c90f5ac (diff) | |
struggling with scheduler and userprog to view ppm files
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/interrupts.c | 4 | ||||
| -rw-r--r-- | kernel/kernel.c | 2 | ||||
| -rw-r--r-- | kernel/scheduler.c | 30 | ||||
| -rw-r--r-- | kernel/smp.c | 3 |
4 files changed, 31 insertions, 8 deletions
diff --git a/kernel/interrupts.c b/kernel/interrupts.c index 5a788c8..387b822 100644 --- a/kernel/interrupts.c +++ b/kernel/interrupts.c @@ -88,6 +88,10 @@ uint32_t interrupt_handler(uint32_t esp, uint32_t irq) break; case INTERRUPT_APIC_TIMER: // frequency is configured in smp.c + esp=scheduler_run(esp,-1); + apic_eoi(); + break; + case INTERRUPT_IPI: // inter process interrupt esp=scheduler_run(esp,0); apic_eoi(); diff --git a/kernel/kernel.c b/kernel/kernel.c index f926139..e7bef1d 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -62,7 +62,7 @@ void kernel_main(uint32_t eax,uint32_t ebx) // -- GET CONFIGS -- // klog("Read Multiboot Structures ..."); multiboot_information *cfg_multiboot; - cfg_multiboot=multiboot_read(eax, ebx,true); // true for silent + cfg_multiboot=multiboot_read(eax, ebx,false); // true for silent // elf_multiboot_read(cfg_multiboot); // just show kernel section headers klog("Read Advanced Power Configuration Interface (ACPI) Structures ..."); diff --git a/kernel/scheduler.c b/kernel/scheduler.c index 0c24f94..23ed7b2 100644 --- a/kernel/scheduler.c +++ b/kernel/scheduler.c @@ -120,8 +120,10 @@ static uint32_t scheduler_schedule(uint32_t idx) if(task_list[cpu][idx].active && !task_list[cpu][idx].syscall) { if(current_task[cpu]!=0)last_task[cpu]=current_task[cpu]; - current_task[cpu]=idx; + + // klog("%d idx %d",last_task[cpu],current_task[cpu]); + install_tss(cpu,task_list[cpu][idx].esp0); x86_set_page_directory(task_list[cpu][idx].vmem); return task_list[cpu][idx].esp; @@ -153,19 +155,36 @@ volatile uint32_t scheduler_run(uint32_t oldesp,uint32_t preference) else task_list[cpu][current_task[cpu]].esp=oldesp; uint32_t esp; - esp=scheduler_schedule(preference); // try preference - if(esp)return esp; + if(preference!=-1) + { + esp=scheduler_schedule(preference); // try preference + if(esp)return esp; + + if(current_task[cpu]==0)// we have interrupted a task with ring1 work + { + esp=scheduler_schedule(last_task[cpu]); // try preference + if(esp)return esp; + } + } + else + { + //klog("preempt %d", last_task[cpu]); + } for(int i=0;i<MAX_TASKS;i++) { int idx=(last_task[cpu]+1+i)%MAX_TASKS; // schedule round robin style + if(preference==-1&&idx==0)continue; if(idx==preference||idx==2)continue;// skip sleeper and preferred tasks here. esp=scheduler_schedule(idx); - if(esp)return esp; + if(esp){ + //klog("%d",idx); + return esp; + } } // force the sleeper task... @@ -349,9 +368,10 @@ void task_syscall_worker() task_list[cpu][0].syscall=true; // sleep (syscall misused) } x86_sti(); + if(nowork) { - __asm__("int $0x81"); // wake scheduler! + __asm__("int $0x81"); // wake scheduler! with IPI } } } diff --git a/kernel/smp.c b/kernel/smp.c index e204b32..f23d15a 100644 --- a/kernel/smp.c +++ b/kernel/smp.c @@ -65,10 +65,9 @@ void run_smp() apic_enable(); klog("Setup the LAPIC Timer on CPU with lapic_id=0x%x ...",apic_id()); - apic_init_timer(2);// freq 2HZ + apic_init_timer(1);// freq x HZ klog("Enable Interrupts on CPU with lapic_id=0x%x ...",apic_id()); - asm_smp_unlock(); smp_set(SMP_APIC_ID,apic_id()); |
