42_KFS/headers/memory.h

64 lines
2.0 KiB
C

#pragma once
#include "multiboot.h"
#include "types.h"
#include <stddef.h>
#include <stdint.h>
#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);