#pragma once #include "multiboot.h" #include #include #include #define PRESENT (1 << 0) #define RW (1 << 1) #define SUPERVISOR (0 << 2) #define ACCESSED (1 << 4) #define INIT_FLAGS (PRESENT | RW | SUPERVISOR) #define PAGE_SIZE 4096 #define PD ((uint32_t *)0xFFFFF000) #define VIRT_PT_BASE 0xFFC00000 #define VIRT_PD_BASE 0xFFFFF000 #define PAGE_MASK 0xFFFFF000 #define VIRT_OFFSET 0xC0000000 #define KERNEL_START ((uint32_t)&_kernel_start) #define KERNEL_END ((uint32_t)&_kernel_end - VIRT_OFFSET) #define KERNEL_PT_END 1020 #define KERNEL_PT_START 769 #define PDE_VBE 1021 #define PDE_FRAME_ZONES 1022 #define PDE_MULTIBOOT 1023 #define PTE2VA(pd_index, pt_index) \ ((uint32_t *)((((uint32_t)pd_index * 1024) + (uint32_t)pt_index) * \ 4096)) static inline uint32_t *VA2PTE(uint32_t va) { uint32_t pde = va >> 22; uint32_t pte = (va >> 12) & 0x3FF; uint32_t *pt = (uint32_t *)(VIRT_PT_BASE + (pde * 0x1000)); return &pt[pte]; } #define GET_FRAME(frame_table, i) (frame_table[i / 8] & (1 << (i % 8))) #define SET_FRAME(frame_table, i, used) \ do { \ if (used) \ frame_table[i / 8] |= (1 << (i % 8)); \ else \ frame_table[i / 8] &= ~(1 << (i % 8)); \ } while (0) struct frame_zone { void *addr; uint32_t first_free_frame; uint8_t *frame_table; uint32_t total_frames; uint32_t remaining_frames; struct frame_zone *next; }; extern uint32_t _kernel_end; extern uint32_t _kernel_start; extern uint32_t boot_page_directory; extern uint32_t boot_page_table1; extern multiboot_memory_map_t *mmap_addr; extern multiboot_uint32_t mmap_length; extern struct frame_zone *head; void init_memory(multiboot_info_t *mbd, uint32_t magic); void *alloc_frame(void); int free_frame(void *frame_ptr); void *kalloc_pages(size_t nb_pages); void *valloc_pages(size_t size, void **phys_addr); int kfree_pages(void *page_ptr, size_t size); int vfree_pages(void *page_ptr, size_t size);