added origin program

This commit is contained in:
2026-06-16 18:44:31 -05:00
parent 0a51a5e8bc
commit 171cbd21bc
12 changed files with 262 additions and 28 deletions

View File

@@ -1,4 +1,4 @@
#include "lib/print.h"
#include "memory/mm.h"
#include "multiboot.h"
#include <stddef.h>
@@ -19,10 +19,6 @@ extern void disable_pae();
#define TEMP_MAPPING_VADDR 0xE0000000
#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];
@@ -92,7 +88,7 @@ static void parse_multiboot_mmap(void* base, uint32_t limit) {
}
}
static void* p_alloc_frame() {
void* p_alloc_frame() {
for (uint32_t i = 0; i < BITMAP_SIZE; i++) {
uint8_t b = memory_bitmap[i];
if (b == 0xFF) {
@@ -116,7 +112,7 @@ static void p_free_frame(void* addr) {
}
// MODIFIES THE ACTIVE PAGE TABLE AT THE PHYSICAL ADDRESS LOADED INTO CR3 VIA RECURSIVE MAPPING
static void map_page(uint32_t vaddr, uint32_t paddr, uint32_t flags) {
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* pd = (uint32_t*)PAGE_DIRECTORY;
@@ -124,7 +120,7 @@ static void map_page(uint32_t vaddr, uint32_t paddr, uint32_t flags) {
if ((pd[pde_entry] & PAGE_PRESENT) == 0) {
uint32_t new_table = (uint32_t)p_alloc_frame();
pd[pde_entry] = new_table | PAGE_PRESENT | PAGE_WRITABLE;
pd[pde_entry] = new_table | flags;
flush_tlb();
for (int i = 0; i < 1024; i++) {
tablev[i] = 0;
@@ -146,11 +142,16 @@ void init_pmm(void* mmap_base, uint32_t mmap_limit) {
}
void init_page_tables() {
uint32_t* kernel_table = p_alloc_frame();
for (int i = 0; i < 1024; i++) {
kernel_table[i] = (i * PAGE_SIZE) | 0x3;
uint32_t kernel_size = (uint32_t)&__kernel_end - (uint32_t)&__kernel_start;
uint32_t num_pages = kernel_size / PAGE_SIZE + 1;
uint32_t num_page_tables = (num_pages + 1023) / 1024;
for (uint32_t table = 0; table < num_page_tables; table++) {
uint32_t* kernel_table = p_alloc_frame();
for (int i = 0; i < 1024; i++) {
kernel_table[i] = (i * PAGE_SIZE) | 0x3;
}
page_directory[768 + table] = (uint32_t)(kernel_table) | 0x3;
}
page_directory[768] = (uint32_t)(kernel_table) | 0x3;
page_directory[0] = 0;
disable_pae();
flush_tlb();
@@ -171,17 +172,19 @@ void* create_user_pd() {
uint32_t* user_pd = (uint32_t*)TEMP_MAPPING_VADDR;
uint32_t* kernel_pd = (uint32_t*)PAGE_DIRECTORY;
for(int i = 0; i < 1024; i++) {
for(int i = 0; i < 768; i++) {
user_pd[i] = 0;
}
user_pd[768] = kernel_pd[768];
for(int i = 768; i < 1023; i++) {
user_pd[i] = kernel_pd[i];
}
user_pd[1023] = (uint32_t)pd_address | PAGE_PRESENT | PAGE_WRITABLE;
uint32_t pde = TEMP_MAPPING_VADDR >> 22;
uint32_t pte = (TEMP_MAPPING_VADDR >> 12) & 0x3FF;
uint32_t* kernel_pt = (uint32_t*)(PAGE_TABLES + (pde * PAGE_SIZE));
kernel_pt[pte] = 0;
flush_tlb();
return (void*)pd_address;
}

View File

@@ -3,16 +3,23 @@
#include <stdint.h>
#define PAGE_PRESENT 0x1
#define PAGE_WRITABLE 0x2
#define PAGE_USER 0x4
typedef struct __attribute__((packed)) {
uint32_t addr;
} mem_page_t;
void init_pmm(void* mmap_base, uint32_t mmap_limit);
void init_page_tables();
void* init_kheap();
void* p_alloc_frame();
uint32_t total_free_memory();
void* create_user_pd();
void map_page(uint32_t vaddr, uint32_t paddr, uint32_t flags);
#endif

View File

@@ -11,4 +11,15 @@ disable_pae:
and $0xFFFFFFEF, %edx
mov %edx, %cr4
ret
.global load_pd
load_pd:
push %ebp
mov %esp, %ebp
mov 8(%ebp), %eax
mov %eax, %cr3
lea flush, %ecx
jmp *%ecx
flush:
leave
ret