summaryrefslogtreecommitdiff
path: root/kernel/arch/i386
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2023-11-08 21:28:10 +0100
committerAnton Kling <anton@kling.gg>2023-11-08 21:29:31 +0100
commit7f54cd8f4839ddf8d1875de69afc81948bd4a3e6 (patch)
tree6a640521e3666914284dc79ae1a4e3174366c3a9 /kernel/arch/i386
parent2026a4f95f3a7dcc9613c8abe2d79d8284b8cd37 (diff)
Kerenl/MMU: Remove dumb bug as a result of uninitalized memory
The kernel would randomly crash. Turns out I did not zero out the frames so my page allocator seemed to get into some weird state.
Diffstat (limited to 'kernel/arch/i386')
-rw-r--r--kernel/arch/i386/mmu.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/kernel/arch/i386/mmu.c b/kernel/arch/i386/mmu.c
index ff35766..aeb4ba6 100644
--- a/kernel/arch/i386/mmu.c
+++ b/kernel/arch/i386/mmu.c
@@ -530,6 +530,7 @@ void paging_init(uint64_t memsize) {
asm volatile("mov %%cr3, %0" : "=r"(cr3));
uint32_t *virtual = (uint32_t *)((uint32_t)cr3 + 0xC0000000);
frames = ksbrk(1024 * sizeof(uint32_t));
+ memset(frames, 0, 1024 * sizeof(uint32_t));
num_of_frames = 1024 * 32;
kernel_directory = &real_kernel_directory;
@@ -547,6 +548,7 @@ void paging_init(uint64_t memsize) {
// Loop through the pages in the table
PageTable *table = kernel_directory->tables[i];
+ write_to_frame(kernel_directory->physical_tables[i], 1);
for (size_t j = 0; j < 1024; j++) {
if (!table->pages[j].present)
continue;
@@ -584,6 +586,7 @@ void paging_init(uint64_t memsize) {
available_memory_kb = memsize;
num_of_frames = available_memory_kb / 4;
uint32_t *new_frames = ksbrk(buffer_size);
+ memset(new_frames, 0, buffer_size);
memcpy(new_frames, frames, 1024 * sizeof(uint32_t));
frames = new_frames;
}