74 lines
2.3 KiB
C
74 lines
2.3 KiB
C
#pragma once
|
|
|
|
#include "multiboot.h"
|
|
#include <stdint.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 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);
|