boot page table works

This commit is contained in:
2026-06-15 23:35:01 -05:00
parent 25da0f6a71
commit fe3725db99
7 changed files with 100 additions and 58 deletions

View File

@@ -1,3 +1,4 @@
#include "lib/print.h"
#include "multiboot.h"
#include <stddef.h>
@@ -5,10 +6,21 @@
extern uint8_t __kernel_start;
extern uint8_t __kernel_end;
extern uint32_t page_directory[1024];
extern void flush_tlb();
extern void disable_pae();
#define PAGE_SIZE 4096
#define MAX_RAM 0xFFFFFFFF // 4GB
#define BITMAP_SIZE ((MAX_RAM / PAGE_SIZE) / 8)
#define PAGE_TABLES 0xFFC00000
#define PAGE_DIRECTORY 0xFFFFF000
#define PAGE_PRESENT 0x1
#define PAGE_WRITABLE 0x2
#define PAGE_USER 0x4
static uint32_t max_address = 0;
static uint32_t total_available_memory = 0;
static uint8_t memory_bitmap[BITMAP_SIZE];
@@ -57,7 +69,7 @@ static void parse_multiboot_mmap(void* base, uint32_t limit) {
uint32_t kernel_phys_start = (uint32_t)&__kernel_start - 0xC0000000;
uint32_t kernel_phys_end = (uint32_t)&__kernel_end - 0xC0000000;
for (uint32_t addr = usable_start; addr < usable_end; addr += 4096) {
if (addr <= (uint32_t)&kernel_phys_end && addr >= (uint32_t)&kernel_phys_start) {
if (addr <= kernel_phys_end && addr >= kernel_phys_start) {
continue;
}
@@ -78,22 +90,7 @@ static void parse_multiboot_mmap(void* base, uint32_t limit) {
}
}
void init_pmm(void* mmap_base, uint32_t mmap_limit) {
for (int i = 0; i < BITMAP_SIZE; i++) {
memory_bitmap[i] = 0xFF;
}
if (mmap_base != NULL && mmap_limit > 0) {
parse_multiboot_mmap(mmap_base, mmap_limit);
}
}
uint32_t total_free_memory() {
return total_available_memory;
}
// this returns the virtual address of the physical page allocated
void* alloc_phys_page() {
static void* p_alloc_frame() {
for (uint32_t i = 0; i < BITMAP_SIZE; i++) {
uint8_t b = memory_bitmap[i];
if (b == 0xFF) {
@@ -104,7 +101,7 @@ void* alloc_phys_page() {
if ((b & (1 << bit)) == 0) {
uint32_t page_addr = (i * 8 + bit) * PAGE_SIZE;
mark_used(page_addr);
return (void*)(page_addr + 0xC0000000);
return (void*)page_addr;
}
}
}
@@ -112,19 +109,59 @@ void* alloc_phys_page() {
return 0;
}
void free_phys_page(void* addr) {
static void p_free_frame(void* addr) {
mark_free((uint32_t)addr);
}
extern uint32_t page_directory[1024];
extern void flush_tlb();
extern void disable_pae();
static void map_page(uint32_t vaddr, uint32_t paddr, uint32_t flags) {
uint32_t pde_entry = vaddr >> 22;
uint32_t pte_entry = (vaddr >> 12) & 0x3FF;
uint32_t* page_directory = (uint32_t*)PAGE_DIRECTORY;
if (page_directory[pde_entry] & PAGE_PRESENT == 0) {
uint32_t* new_table = (uint32_t*)p_alloc_frame();
page_directory[pde_entry] = (uint32_t)new_table | flags;
}
}
static void* p_alloc(uint32_t size_b, uint32_t vstart) {
uint32_t pages = (size_b + PAGE_SIZE - 1) / PAGE_SIZE;
for (uint32_t i = 0; i < pages; i++) {
uint32_t vaddr = vstart + i * PAGE_SIZE;
uint32_t paddr = (uint32_t)p_alloc_frame();
map_page(vaddr, paddr, PAGE_PRESENT | PAGE_WRITABLE);
}
return (void*)vstart;
}
void init_pmm(void* mmap_base, uint32_t mmap_limit) {
for (int i = 0; i < BITMAP_SIZE; i++) {
memory_bitmap[i] = 0xFF;
}
if (mmap_base != NULL && mmap_limit > 0) {
parse_multiboot_mmap(mmap_base, mmap_limit);
}
}
void init_page_tables() {
uint32_t* kernel_table = alloc_phys_page();
uint32_t* kernel_table = p_alloc_frame();
for (int i = 0; i < 1024; i++) {
kernel_table[i] = (i * PAGE_SIZE) | 0x3;
}
uint32_t* phys_table = kernel_table - 0xC000000;
page_directory[768] = (uint32_t)(phys_table) | 0x3;
page_directory[768] = (uint32_t)(kernel_table) | 0x3;
page_directory[0] = 0;
disable_pae();
flush_tlb();
}
void* init_kheap() {
}
uint32_t total_free_memory() {
return total_available_memory;
}