From 4e3ef9593d5eff3d3e5f1d67e47df4f954361a55 Mon Sep 17 00:00:00 2001 From: apio Date: Wed, 12 Oct 2022 17:08:17 +0200 Subject: [PATCH] Scheduler: Move ELF image freeing to ELFLoader --- kernel/include/sys/elf/ELFLoader.h | 1 + kernel/src/sys/elf/ELFLoader.cpp | 17 +++++++++++++++-- kernel/src/thread/Scheduler.cpp | 9 ++------- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/kernel/include/sys/elf/ELFLoader.h b/kernel/include/sys/elf/ELFLoader.h index 1cdc8fd9..6fa3fe24 100644 --- a/kernel/include/sys/elf/ELFLoader.h +++ b/kernel/include/sys/elf/ELFLoader.h @@ -6,4 +6,5 @@ namespace ELFLoader { ELFImage* load_elf_from_address(uintptr_t addr); ELFImage* load_elf_from_filesystem(const char* filename); + void release_elf_image(ELFImage* image); } \ No newline at end of file diff --git a/kernel/src/sys/elf/ELFLoader.cpp b/kernel/src/sys/elf/ELFLoader.cpp index 4c9f08c7..64395567 100644 --- a/kernel/src/sys/elf/ELFLoader.cpp +++ b/kernel/src/sys/elf/ELFLoader.cpp @@ -104,8 +104,10 @@ ELFImage* ELFLoader::load_elf_from_address(uintptr_t addr) return 0; } uint64_t pages = Utilities::get_blocks_from_size(PAGE_SIZE, (phdr->p_vaddr % PAGE_SIZE) + phdr->p_memsz); - void* buffer = MemoryManager::get_pages_at(phdr->p_vaddr, pages, - phdr->p_flags & 2 ? MAP_READ_WRITE | MAP_USER : MAP_USER); + void* buffer = (void*)((uint64_t)MemoryManager::get_pages_at( + Utilities::round_down_to_nearest_page(phdr->p_vaddr), pages, + phdr->p_flags & 2 ? MAP_READ_WRITE | MAP_USER : MAP_USER) + + (phdr->p_vaddr % PAGE_SIZE)); memcpy(buffer, (void*)(addr + phdr->p_offset), phdr->p_filesz); memset((void*)((uint64_t)buffer + phdr->p_filesz), 0, phdr->p_memsz - phdr->p_filesz); image = (ELFImage*)krealloc(image, (sizeof(ELFImage) - sizeof(ELFSection)) + @@ -123,4 +125,15 @@ ELFImage* ELFLoader::load_elf_from_address(uintptr_t addr) return 0; } return image; +} + +void ELFLoader::release_elf_image(ELFImage* image) +{ + for (uint64_t i = 0; i < image->section_count; i++) + { + ELFSection& section = image->sections[i]; + kdbgln("Freeing up section %lx, was using %ld pages", section.base, section.pages); + MemoryManager::release_pages((void*)Utilities::round_down_to_nearest_page(section.base), section.pages); + } + kfree(image); } \ No newline at end of file diff --git a/kernel/src/thread/Scheduler.cpp b/kernel/src/thread/Scheduler.cpp index fe8cef85..b3545427 100644 --- a/kernel/src/thread/Scheduler.cpp +++ b/kernel/src/thread/Scheduler.cpp @@ -163,14 +163,9 @@ void Scheduler::reap_task(Task* task) MemoryManager::release_pages((void*)exiting_task->allocated_stack, TASK_PAGES_IN_STACK); if (exiting_task->image) // FIXME: Also free pages the task has mmap-ed but not munmap-ed. { - for (uint64_t i = 0; i < exiting_task->image->section_count; i++) - { - ELFSection& section = exiting_task->image->sections[i]; - kdbgln("Task was using region %lx, which used %ld pages", section.base, section.pages); - MemoryManager::release_pages((void*)section.base, section.pages); - } - kfree(exiting_task->image); + ELFLoader::release_elf_image(exiting_task->image); } + for (int i = 0; i < TASK_MAX_FDS; i++) { exiting_task->files[i].close(); } delete exiting_task; }