#include "memory.h" #include "debug.h" #include "kprintf.h" #include "utils.h" #include uint32_t *page_directory = &boot_page_directory; uint32_t page_table_default[1024] __attribute__((aligned(PAGE_SIZE))); uint32_t multiboot_page_table[1024] __attribute__((aligned(PAGE_SIZE))); uint32_t mem_size; multiboot_uint32_t *mmap_addr; multiboot_uint32_t mmap_length; static void init_multiboot(multiboot_info_t *mbd, uint32_t magic) { if (magic != MULTIBOOT_BOOTLOADER_MAGIC) kpanic("invalid magic number! (git good skill issue)"); init_page_table(multiboot_page_table, 0); page_directory[1023] = ((uint32_t)multiboot_page_table - HEAP_END) | 0x03; const size_t mbd_size = CEIL( (uint32_t)mbd % PAGE_SIZE + sizeof(multiboot_info_t), PAGE_SIZE); kprintf("cramptes0\n"); // Index multiboot_info_t struct for (uint32_t i = 0; i < mbd_size; i++) multiboot_page_table[i] = ((uint32_t)mbd + PAGE_SIZE * i) & PAGE_MASK | INIT_FLAGS; multiboot_info_t *mbd_virt = (multiboot_info_t *)(GET_PAGE_ADDR(1023, 0) + (uint32_t)mbd % PAGE_SIZE); kprintf("cramptes1\n"); PRINT_PTR(mbd_virt); /* PRINT_UINT(mbd_virt->mmap_length); */ // Index mbd->mmap_addr pointers for (uint32_t i = 0; i < mbd_virt->mmap_length; i++) multiboot_page_table[i + mbd_size] = ((mbd_virt->mmap_addr + i * PAGE_SIZE) & PAGE_MASK) | INIT_FLAGS; kprintf("cramptes2\n"); mmap_addr = (multiboot_uint32_t *)(GET_PAGE_ADDR(1023, mbd_size) + (uint32_t)mbd_virt->mmap_addr % PAGE_SIZE); kprintf("cramptes3\n"); mmap_length = mbd_virt->mmap_length; } void init_memory(multiboot_info_t *mbd, uint32_t magic) { assert(page_directory); for (uint16_t i = 0; i < 0x300; i++) page_directory[i] = 0x02; init_page_table(page_table_default, 0); page_directory[0] = ((uint32_t)page_table_default - HEAP_END) | 0x03; init_multiboot(mbd, magic); }