#ifndef PAGING_H #define PAGING_H #include "../include/stdio.h" #include "../include/multiboot.h" #include #define PAGE_OFFSET 0xC0000000 #define PAGE_SIZE 4096 #define PAGE_SHIFT 0x0C #define PAGE_MASK ~(PAGE_SIZE - 1) /* 0xFFFFF000 */ #define PAGE_ALIGN(addr) (((addr) + (PAGE_SIZE - 1)) & PAGE_MASK) #define PAGE_PRESENT 0x1 #define PAGE_RW 0x002 /* Read/Write */ #define PAGE_USER 0x004 /* User */ #define PAGE_NOALLOC 0x200 /* No Page Allocated (OS managed) */ #define GDT_BASE (0xFFFFFFFF - (PAGE_OFFSET - 1)) #define GET_PGDIR(address) ((uint32_t)((address) >> 22) & 0x3FF) #define GET_PGTBL(address) ((uint32_t)((address) >> 12) & 0x3FF) // Общий размер памяти #define MEMORY_SIZE (0xFFFFFFFF-0xC0000000) // Количество страниц #define PAGE_COUNT (MEMORY_SIZE / PAGE_SIZE) // Размер битмапа в байтах (округлено вверх) #define BITMAP_SIZE 1024//(PAGE_COUNT / 8) extern uint32_t *kpage_dir; //paging.c void grub_memory_map(unsigned int magic, struct multiboot_info* mbi); uint32_t* get_page_dir(); void set_page_dir(uint32_t new_page_dir); uint32_t phys_to_virt(uint32_t phys); uint32_t* create_page_dir(); void destroy_page_dir(uint32_t* page_dir); uint32_t* copy_page_dir(uint32_t* page_dir_virt); static inline uint32_t virt_to_phys(void* virt) { return (uint32_t)virt - 0xC0000000; } //page_alloc.c int is_page_in_use(uint32_t page_index); void set_bit(uint32_t page_index); void clear_bit(uint32_t page_index); void init_allocator(); void* alloc_page(); void free_page(void* physaddr); //page_tables.c void *get_physaddr(void *virtualaddr); uint32_t get_pte(void *virtualaddr); void map_page(void* physaddr, void* virtualaddr, unsigned int flags); void unmap_page(void *virtualaddr); int map_page_in_directory(uint32_t* pd_virt_addr, void* phys_addr, void* virt_addr, uint32_t flags); #endif