Scheduler: Move ELF image freeing to ELFLoader

This commit is contained in:
apio 2022-10-12 17:08:17 +02:00
parent a6f0a7056f
commit 4e3ef9593d
3 changed files with 18 additions and 9 deletions

View File

@ -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);
}

View File

@ -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)) +
@ -124,3 +126,14 @@ ELFImage* ELFLoader::load_elf_from_address(uintptr_t addr)
}
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);
}

View File

@ -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;
}