#pragma once #include "multiboot.h" #include "types.h" #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 PT_SIZE 1024 #define PD_SIZE 1024 #define PAGE_MASK 0xFFFFF000 #define HEAP_END 0xC0000000 #define HEAP_START ((u32) & _kernel_end - HEAP_END) #define KERNEL_START ((u32) & _kernel_start) #define KERNEL_END ((u32) & _kernel_end - HEAP_END) #define PT_START 256 #define GET_PAGE_ADDR(pd_index, pt_index) \ ((((u32)pd_index * 1024) + (u32)pt_index) * 4096) #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; u32 first_free_frame; u8 *frame_table; u32 total_frames; u32 remaining_frames; struct frame_zone *next; }; extern u32 _kernel_end; extern u32 _kernel_start; extern u32 boot_page_directory; extern u32 *page_directory; extern u32 page_table_default[1024]; extern u32 mem_size; extern multiboot_memory_map_t *mmap_addr; extern multiboot_u32 mmap_length; extern struct frame_zone *head; u32 *virt_to_phys(u32 *virt_addr); void init_memory(multiboot_info_t *mbd, u32 magic); void *alloc_frame(void); int free_frame(void *frame_ptr); i8 add_single_page(void *frame); void *alloc_pages(size_t size, void **phys_addr); int free_pages(void *page_ptr, size_t size); void init_page_table(u32 page_table[1024], u16 start); int16_t add_page_table(u16 pd_index);