63 lines
1.8 KiB
C
63 lines
1.8 KiB
C
#ifndef PAGING_H
|
|
#define PAGING_H
|
|
|
|
#include "../include/stdio.h"
|
|
#include "../include/multiboot.h"
|
|
#include <stdint.h>
|
|
|
|
#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 (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);
|
|
|
|
static inline uint32_t virt_to_phys(void* virt) {
|
|
return (uint32_t)virt - 0xC0000000;
|
|
}
|
|
|
|
//page_alloc.c
|
|
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
|