Fri, 08 Dec 2023 20:35:21 +0100
2 files changed,
16 insertions(+),
8 deletions(-)
M
kernel/mm/paging.c
→
kernel/mm/paging.c
@@ -204,12 +204,15 @@
EXCEPTION(page_fault_isr, frame, error_code) { volatile VIRT_ADDR faulty_addr; __asm__ volatile ("mov %%cr2, %0" : "=a" (faulty_addr)); - + uint32_t pdir_index = PAGE_DIR_INDEX(faulty_addr); + uint32_t ptbl_index = PAGE_TABLE_INDEX(faulty_addr); + if (error_code & PAGE_FAULT_FLAGS_PRESENT) { kpanic("Page-protection violation!"); } else { PHYS_ADDR new_page = get_free_page(); - force_map_page_to_this(new_page, PAGE_DIR_INDEX(faulty_addr), PAGE_TABLE_INDEX(faulty_addr), PAGE_TABLE_FLAGS); + force_map_page_to_this(new_page, pdir_index, ptbl_index, PAGE_TABLE_FLAGS); + memset(PAGE_MAPPED_ADDR(pdir_index, ptbl_index), 0, PAGE_SIZE); } }
M
kernel/sched/sched.c
→
kernel/sched/sched.c
@@ -32,6 +32,7 @@ #endif
PROCESS* get_slot(void) { PROCESS *new_process = (PROCESS*)malloc(sizeof(PROCESS)); + memset(new_process, 0, sizeof(PROCESS)); return new_process; }@@ -206,8 +207,13 @@
current_pid = 0; // create idle process - PROCESS_ID idle = sched_spawn(NULL, NULL, 0); - assert(idle == 0); + PROCESS_ID idle_pid = sched_spawn(NULL, NULL, 0); + assert(idle_pid == 0); + + PROCESS *idle = get_process(idle_pid); + assert(idle != NULL); + + idle->state = PSTATE_READY; return 1; }@@ -217,8 +223,8 @@ crit_enter();
PROCESS *current = get_process(current_pid); uint32_t csc = crit_stash(); - sti(); INT(0x20); + sti(); crit_restore(csc); crit_exit();@@ -258,14 +264,13 @@ for (PROCESS *child = process->child; child != NULL; child = child->next_sibling) {
sched_kill(child->id); } - remove_process(process->id); + process->state = PSTATE_TERMINATED; } else { success = 0; } - if (get_process(current_pid) == NULL) { + if (pid == current_pid) { // current process has terminated - crit_reset(); sched_yield(); }