From f98a45aefe3f59f6aeaadb3f1e8f82d8bc036bbf Mon Sep 17 00:00:00 2001 From: apio Date: Sat, 10 Sep 2022 22:15:19 +0200 Subject: [PATCH] Updated InitRD to use virtual mappings --- kernel/include/init/InitRD.h | 4 +++- kernel/src/init/InitRD.cpp | 22 ++++++++++++++++++---- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/kernel/include/init/InitRD.h b/kernel/include/init/InitRD.h index e4275507..de7df06b 100644 --- a/kernel/include/init/InitRD.h +++ b/kernel/include/init/InitRD.h @@ -36,9 +36,11 @@ namespace InitRD int get_total_blocks(); File get_file(TarHeader* header); + void free_file(File& file); TarHeader* get_block(int block_index); bool is_valid_header(TarHeader* header); - File find_file(const char* filename); + File open(const char* filename); + void close(File& f); void for_each(void (*callback)(File& file)); } \ No newline at end of file diff --git a/kernel/src/init/InitRD.cpp b/kernel/src/init/InitRD.cpp index b107fd3d..ca9cb7d4 100644 --- a/kernel/src/init/InitRD.cpp +++ b/kernel/src/init/InitRD.cpp @@ -1,6 +1,7 @@ #include "init/InitRD.h" #include "bootboot.h" #include "io/Serial.h" +#include "memory/KernelMemoryManager.h" #include "std/stdlib.h" #include @@ -31,7 +32,6 @@ InitRD::File InitRD::get_file(TarHeader* header) File result; result.size = 0; memcpy(result.name, header->name, 100); - result.addr = (void*)(header + TAR_BLOCKSIZE); int multiplier = 1; // why they decided to store the size as an octal-encoded string instead of an integer is beyond me for (int i = 10; i >= 0; i--) @@ -39,21 +39,28 @@ InitRD::File InitRD::get_file(TarHeader* header) result.size += (multiplier * (header->size[i] - 48)); multiplier *= 8; } + result.addr = KernelMemoryManager::get_unaligned_mappings((void*)(header + TAR_BLOCKSIZE), result.size / 4096 + 1); result.size_in_blocks = result.size / TAR_BLOCKSIZE + 1; return result; } -InitRD::File InitRD::find_file(const char* filename) +void InitRD::free_file(File& file) +{ + KernelMemoryManager::release_unaligned_mappings(file.addr, file.size / 4096 + 1); +} + +InitRD::File InitRD::open(const char* filename) { int block = 0; int total_blocks = get_total_blocks(); while (block < total_blocks) { - TarHeader* hdr = get_block(block); + TarHeader* hdr = (TarHeader*)KernelMemoryManager::get_unaligned_mapping(get_block(block)); block++; if (hdr->typeflag == 53) { continue; } // Directory if (!is_valid_header(hdr)) { continue; } auto f = get_file(hdr); + KernelMemoryManager::release_unaligned_mapping(hdr); if (strncmp(hdr->name, filename, strlen(filename)) == 0) { return f; } block += get_file_size_in_blocks(f); } @@ -64,18 +71,25 @@ InitRD::File InitRD::find_file(const char* filename) return nullFile; } +void InitRD::close(File& file) +{ + free_file(file); +} + void InitRD::for_each(void (*callback)(File& f)) { int block = 0; int total_blocks = get_total_blocks(); while (block < total_blocks) { - TarHeader* hdr = get_block(block); + TarHeader* hdr = (TarHeader*)KernelMemoryManager::get_unaligned_mapping(get_block(block)); block++; if (hdr->typeflag == 53) { continue; } // Directory if (!is_valid_header(hdr)) { continue; } auto f = get_file(hdr); block += get_file_size_in_blocks(f); + KernelMemoryManager::release_unaligned_mapping(hdr); callback(f); + close(f); } } \ No newline at end of file