diff --git a/apps/test1.app b/apps/test1.app index 4af1930..714cde4 100644 Binary files a/apps/test1.app and b/apps/test1.app differ diff --git a/apps/test1.asm b/apps/test1.asm index bb606e3..c3ed857 100644 --- a/apps/test1.asm +++ b/apps/test1.asm @@ -1,5 +1,8 @@ ; test app 1 +[bits 32] +org 0x0 + header: dd 0x4D534F48 ; magic identifier "HOSM" dd 2 ; test app diff --git a/apps/test2.app b/apps/test2.app index 585b562..890b3a1 100644 Binary files a/apps/test2.app and b/apps/test2.app differ diff --git a/apps/test2.asm b/apps/test2.asm index 0336b3e..79712ea 100644 --- a/apps/test2.asm +++ b/apps/test2.asm @@ -1,5 +1,8 @@ ; test app 1 +[bits 32] +org 0x0 + header: dd 0x4D534F48 ; magic identifier "HOSM" dd 2 ; test app diff --git a/kernel/boot.asm b/kernel/boot.asm index 66f0294..d93f8ef 100644 --- a/kernel/boot.asm +++ b/kernel/boot.asm @@ -180,10 +180,14 @@ newgdtcontinue: mov ax, TSS0_SEG ltr ax - push esp - push msg1 - call _kprintf - add esp, 8 +; push esp +; push msg1 +; call _kprintf +; add esp, 8 + + mov eax, esp + push KERNEL_DATA + push eax idle_loop: ; system idle loop sti diff --git a/kernel/idt.inc b/kernel/idt.inc index 098ce2f..47f8c24 100644 --- a/kernel/idt.inc +++ b/kernel/idt.inc @@ -13,11 +13,11 @@ isr_%1: push eax mov eax, %1 - push eax - push esp - push msg - call _kprintf - add esp, 12 +; push eax +; push esp +; push msg +; call _kprintf +; add esp, 12 ; hlt jmp isr_main @@ -91,10 +91,10 @@ isr_main: call _isr add esp, 8 - mov eax, [_proc_new_ss] - mov ebx, [_proc_new_esp] - mov ss, ax - mov esp, ebx +; mov eax, [_proc_new_ss] +; mov ebx, [_proc_new_esp] +; mov ss, ax +; mov esp, ebx pop gs pop fs diff --git a/kernel/kernel.c b/kernel/kernel.c index 1d038c7..c865bdf 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -152,7 +152,7 @@ void k_init() { kprintf("Creating a task\n"); create_task((void *)mb_modules[i].mod_start, - mb_modules[i].mod_end - mb_modules[i].mod_end, + mb_modules[i].mod_end - mb_modules[i].mod_start, 0, ((hos_module_header_t*)(mb_modules[i].mod_start))->init); } @@ -208,6 +208,7 @@ void isr(u32_t num, int_stack_t *int_stack) case 0x20: // timer timer++; (*(u16_t *)CONSOLE_MEMORY)++; + proc_sched(int_stack); pic_eoi(); break; case 0x21: // keyboard @@ -219,11 +220,9 @@ void isr(u32_t num, int_stack_t *int_stack) putc(int_stack->ebx); break; default: - kprintf("Unhandled interrupt #%d, CR2 = 0x%x!\n", num, read_cr2()); + kprintf("Unhandled interrupt #%d, CR2 = 0x%x, int_stack at 0x%x!\n", num, read_cr2(), int_stack); halt(); } - if ( (num == 0x20) || (proc_new_esp == 0) ) - proc_sched(int_stack); criticalCounter--; } diff --git a/kernel/kernel.h b/kernel/kernel.h index aade35d..9865a09 100644 --- a/kernel/kernel.h +++ b/kernel/kernel.h @@ -33,8 +33,8 @@ typedef struct u32_t eip; u32_t cs; u32_t eflags; - u32_t ss; /* present if ring3->ring0 transition ?? */ u32_t esp; + u32_t ss; /* present if ring3->ring0 transition ?? */ } int_stack_t; /* returns true to callee if we should jump to a real mode module */ diff --git a/kernel/proc/proc.c b/kernel/proc/proc.c index 3f6e045..7f3a3e3 100644 --- a/kernel/proc/proc.c +++ b/kernel/proc/proc.c @@ -42,11 +42,11 @@ int proc_init() void proc_sched(int_stack_t *int_stack) { - processes[cur_task]->esp = (u32_t) int_stack; - processes[cur_task]->ss = read_ss(); - cur_task = (cur_task + 1) % 3; - proc_new_esp = processes[cur_task]->esp; - proc_new_ss = processes[cur_task]->ss; + memcpy(&processes[cur_task]->int_stack, int_stack, sizeof(int_stack_t)); + cur_task++; + if (cur_task == 3) + cur_task = 0; + memcpy(int_stack, &processes[cur_task]->int_stack, sizeof(int_stack_t)); write_cr3(processes[cur_task]->p_page_dir); } @@ -105,29 +105,19 @@ void create_process_stack(process_t *p, void *entry) u32_t *ptr32 = v_stack_table; for (i = 0; i < 1023; i++) *ptr32++ = 0; - v_stack_table[1032] = p_stack | 0x7; /* user permissions */ + v_stack_table[1023] = p_stack | 0x7; /* user permissions */ p->page_dir[511] = p_stack_table | 0x7; /* stack at 2GB */ - i = 1023; /* top of stack */ - v_stack[i--] = 0x20000000; - v_stack[i--] = SEG_USER_DATA | 0x3; - v_stack[i--] = 0x0202; - v_stack[i--] = SEG_USER_CODE | 0x3; - v_stack[i--] = (u32_t) entry; - v_stack[i--] = 0; - v_stack[i--] = 0; - v_stack[i--] = 0; - v_stack[i--] = 0; - v_stack[i--] = 0; - v_stack[i--] = 0; - v_stack[i--] = 0; - v_stack[i--] = SEG_USER_DATA | 0x3; - v_stack[i--] = SEG_USER_DATA | 0x3; - v_stack[i--] = SEG_USER_DATA | 0x3; - v_stack[i--] = SEG_USER_DATA | 0x3; vmm_unmapp(v_stack_table); vmm_unmapp(v_stack); - p->ss = SEG_USER_DATA | 0x3; - p->esp = 0x20000000 - sizeof(int_stack_t); + p->int_stack.ds = SEG_USER_DATA | 0x3; + p->int_stack.es = SEG_USER_DATA | 0x3; + p->int_stack.fs = SEG_USER_DATA | 0x3; + p->int_stack.gs = SEG_USER_DATA | 0x3; + p->int_stack.ss = SEG_USER_DATA | 0x3; + p->int_stack.esp = 0x20000000; + p->int_stack.eflags = 0x0202; + p->int_stack.cs = SEG_USER_CODE | 0x3; + p->int_stack.eip = (u32_t)entry; } /* Copy pages into new address space (v_page_dir must be set up) */ @@ -148,7 +138,7 @@ void copy_into_address_space(u32_t dest_addr, /* Time for a new page table & page directory entry! */ p->v_page_dir[pde] = (u32_t)vmm_palloc_addr(&p_page_addr); p->page_dir[pde] = p_page_addr | 0x7; - vmm_unmapp((void *)p->v_page_dir[pde]); +// vmm_unmapp((void *)p->v_page_dir[pde]); } page = vmm_palloc_addr(&p_page_addr); ((u32_t *)(p->v_page_dir[pde]))[pte] = p_page_addr | 0x7; diff --git a/kernel/proc/proc.h b/kernel/proc/proc.h index 46baa32..d34b744 100644 --- a/kernel/proc/proc.h +++ b/kernel/proc/proc.h @@ -15,8 +15,12 @@ typedef struct u32_t *v_page_dir; /* Virtual page table addresses for init */ u32_t p_page_dir; /* Physical address of page directory */ u32_t size; /* Process size, bytes from 0 through bss */ - u32_t ss; - u32_t esp; +// u32_t ss; +// u32_t esp; +// u32_t eflags; +// u32_t cs; +// u32_t eip; + int_stack_t int_stack; } process_t; typedef struct