From 5dc4e27392aaab78f3be45be8f485d37eb362818 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Thu, 4 Jan 2018 00:10:27 +0100 Subject: [PATCH] Map all free memory pages and add to page stack --- src/kernel/Link.ld | 2 ++ src/kernel/boot/kmain.c | 15 +++++++++++++++ src/kernel/include/memory.h | 3 +++ 3 files changed, 20 insertions(+) diff --git a/src/kernel/Link.ld b/src/kernel/Link.ld index 2fa7802..767844d 100644 --- a/src/kernel/Link.ld +++ b/src/kernel/Link.ld @@ -6,6 +6,7 @@ KERNEL_START = 0x10000; SECTIONS { . = KERNEL_START + KERNEL_OFFSET; + kernel_start = .; .text : AT(ADDR(.text) - KERNEL_OFFSET) { *(.multiboot) @@ -24,4 +25,5 @@ SECTIONS *(.COMMON) *(.bss) } + kernel_end = .; } diff --git a/src/kernel/boot/kmain.c b/src/kernel/boot/kmain.c index ebdbd03..b2e01fd 100644 --- a/src/kernel/boot/kmain.c +++ b/src/kernel/boot/kmain.c @@ -22,7 +22,22 @@ void kmain(uint64_t multiboot_magic, void *multiboot_data) uintptr_t start, end; uint32_t type, i=0; while(!multiboot_get_memory_area(i++, &start, &end, &type)) + { + if(type != 1) + continue; debug_printf("Mem %d 0x%x-0x%x\n", type, start, end); + for(uintptr_t p = start; p < end; p += PAGE_SIZE) + { + if(p >= V2P(&kernel_start) && p < V2P(&kernel_end)) + continue; + if(!(p & 0x1FFFFF)) + { + touch_page(&BootP4, (uintptr_t)P2V(p), PAGE_HUGE); + vmm_set_page(&BootP4, (uintptr_t)P2V(p), p, PAGE_HUGE | PAGE_WRITE | PAGE_PRESENT); + } + pmm_free(p); + } + } debug_ok("Boot \"Complete\"\n"); diff --git a/src/kernel/include/memory.h b/src/kernel/include/memory.h index 498cf3a..e22f554 100644 --- a/src/kernel/include/memory.h +++ b/src/kernel/include/memory.h @@ -38,4 +38,7 @@ uintptr_t vmm_get_page(void *P4, uintptr_t addr); int vmm_set_page(void *P4, uintptr_t addr, uintptr_t page, uint16_t flags); int touch_page(void *P4, uintptr_t addr, uint16_t flags); void free_page(void *P4, uintptr_t addr, int free); + +extern union PTE BootP4; +extern int kernel_start, kernel_end; #endif