wip: change memory to use recursive paging

This commit is contained in:
0x35c
2025-11-28 11:08:28 +01:00
parent c5f8599d90
commit c33f8fc05d
10 changed files with 95 additions and 149 deletions

View File

@ -12,18 +12,31 @@
#define ACCESSED (1 << 4)
#define INIT_FLAGS (PRESENT | RW | SUPERVISOR)
#define PAGE_SIZE 4096
#define PT_SIZE 1024
#define PD_SIZE 1024
#define PD ((uint32_t *)0xFFFFF000)
#define VIRT_PT_BASE 0xFFC00000
#define VIRT_PD_BASE 0xFFFFF000
#define PAGE_MASK 0xFFFFF000
#define HEAP_END 0xC0000000
#define HEAP_START ((uint32_t)&_kernel_end - HEAP_END)
#define VIRT_OFFSET 0xC0000000
#define KERNEL_START ((uint32_t)&_kernel_start)
#define KERNEL_END ((uint32_t)&_kernel_end - HEAP_END)
#define KERNEL_END ((uint32_t)&_kernel_end - VIRT_OFFSET)
#define KERNEL_PT_END 1020
#define KERNEL_PT_START 769
#define GET_PAGE_ADDR(pd_index, pt_index) \
((((uint32_t)pd_index * 1024) + (uint32_t)pt_index) * 4096)
#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) \
@ -47,23 +60,14 @@ extern uint32_t _kernel_end;
extern uint32_t _kernel_start;
extern uint32_t boot_page_directory;
extern uint32_t boot_page_table1;
extern uint32_t *kernel_pd;
extern uint32_t *current_pd;
extern uint32_t page_table_default[1024];
extern uint32_t mem_size;
extern multiboot_memory_map_t *mmap_addr;
extern multiboot_uint32_t mmap_length;
extern struct frame_zone *head;
uint32_t *virt_to_phys(uint32_t *virt_addr);
void init_memory(multiboot_info_t *mbd, uint32_t magic);
void *alloc_frame(void);
int free_frame(void *frame_ptr);
int8_t add_single_page(void *frame);
void *kalloc_pages(size_t size, void **phys_addr);
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);
void init_page_table(uint32_t page_table[1024], uint16_t start);
int16_t add_page_table(uint16_t pd_index, uint16_t pt_start);
void switch_pd(uint32_t *pd, uint32_t *cr3);