From b9e8030aacae5ee89ee0ca5cfd7c8edd360ac01d Mon Sep 17 00:00:00 2001 From: apio Date: Thu, 16 Mar 2023 23:02:53 +0100 Subject: [PATCH] kernel: Free the initial ramdisk memory after copying everything into the VFS --- kernel/src/InitRD.cpp | 6 ++++++ kernel/src/memory/MemoryManager.cpp | 11 +++++++++++ kernel/src/memory/MemoryManager.h | 1 + 3 files changed, 18 insertions(+) diff --git a/kernel/src/InitRD.cpp b/kernel/src/InitRD.cpp index 1a65dae5..ad8d9bdd 100644 --- a/kernel/src/InitRD.cpp +++ b/kernel/src/InitRD.cpp @@ -3,7 +3,9 @@ #include "arch/MMU.h" #include "boot/bootboot.h" #include "fs/VFS.h" +#include "memory/MemoryManager.h" #include +#include TarStream g_initrd; extern const BOOTBOOT bootboot; @@ -43,5 +45,9 @@ Result InitRD::populate_vfs() TRY(vfs_create_dir_if_not_exists(entry.name, entry.mode)); } } + + // Now we don't need the original initrd anymore + MemoryManager::free_frames(bootboot.initrd_ptr, get_blocks_from_size(bootboot.initrd_size, ARCH_PAGE_SIZE)); + return {}; } diff --git a/kernel/src/memory/MemoryManager.cpp b/kernel/src/memory/MemoryManager.cpp index 300b5847..4d4d2d20 100644 --- a/kernel/src/memory/MemoryManager.cpp +++ b/kernel/src/memory/MemoryManager.cpp @@ -170,6 +170,17 @@ namespace MemoryManager return {}; } + Result free_frames(u64 address, usize count) + { + while (count--) + { + TRY(free_frame(address)); + address += ARCH_PAGE_SIZE; + } + + return {}; + } + Result remap(u64 address, usize count, int flags) { CHECK_PAGE_ALIGNED(address); diff --git a/kernel/src/memory/MemoryManager.h b/kernel/src/memory/MemoryManager.h index bc2a11c8..98e16267 100644 --- a/kernel/src/memory/MemoryManager.h +++ b/kernel/src/memory/MemoryManager.h @@ -11,6 +11,7 @@ namespace MemoryManager Result alloc_frame(); Result free_frame(u64 frame); + Result free_frames(u64 address, usize count); void lock_frame(u64 frame); void lock_frames(u64 frames, usize count);