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

@@ -9,6 +9,8 @@
#include "memory/mm.h"
#include "elf.h"
extern void init_idt();
extern void init_gdt();
extern void init_pic();
@@ -23,6 +25,69 @@ extern char __kernel_end;
void* user_page_directories[10];
void load_origin_program(multiboot_info* mbi) {
user_page_directories[0] = create_user_pd();
kprintf("Created origin process page directory @ [phys] 0x%x\n", user_page_directories[0]);
extern void load_pd(void* pd);
extern void flush_tlb();
load_pd(user_page_directories[0]);
flush_tlb();
kprintf("switched to user address space\n");
uint32_t mods_virtual_addr = mbi->mods_addr + 0xC0000000;
kprintf("parsing mutliboot modules @ 0x%x\n", mods_virtual_addr);
if (mbi->mods_count == 0) {
return;
}
multiboot_module_entry* modules = (multiboot_module_entry*)mods_virtual_addr;
uint32_t elf_vbase = 0xE0000000;
uint32_t elf_pbase = modules[0].mod_start;
uint32_t elf_limit = modules[0].mod_end - modules[0].mod_start;
uint32_t elf_pages_needed = (elf_limit / 4096) + 1;
for (uint32_t i = 0; i < elf_pages_needed; i++) {
const uint32_t vaddr = elf_vbase + (i * 4096);
const uint32_t paddr = elf_pbase + (i * 4096);
map_page(vaddr, paddr, PAGE_PRESENT | PAGE_WRITABLE);
}
elf_header_t* elf = (elf_header_t*)elf_vbase;
elf_program_header_t* ph = (elf_program_header_t*)(elf_vbase + elf->e_phoff);
kprintf("elf header @ 0x%x\n", elf);
kprintf("program headers @ 0x%x\n", ph);
// load program sections into physical memory and map the pages
for (int i = 0; i < elf->e_phnum; i++) {
if (ph[i].p_type == PT_LOAD) {
uint32_t v_start = ph[i].p_vaddr & 0xFFFFF000;
uint32_t v_end = (ph[i].p_vaddr + ph[i].p_memsz + 4095) & 0xFFFFF000;
for (uint32_t page = v_start; page < v_end; page += 4096) {
uint32_t frame_paddr = (uint32_t)p_alloc_frame();
map_page(page, frame_paddr, PAGE_PRESENT | PAGE_WRITABLE | PAGE_USER);
}
for (uint32_t j = 0; j < ph[i].p_memsz; j++) {
((char*)ph[i].p_vaddr)[j] = 0;
}
for (uint32_t j = 0; j < ph[i].p_filesz; j++) {
((char*)ph[i].p_vaddr)[j] = ((char*)(elf_vbase + ph[i].p_offset))[j];
}
}
}
// allocate the user stack
uint32_t stack_paddr = (uint32_t)p_alloc_frame();
map_page(0xBFFFF000, stack_paddr, PAGE_PRESENT | PAGE_WRITABLE | PAGE_USER);
kprintf("program loaded into memory @ [virt] 0x%x\n", elf->e_entry);
}
void kmain(uint32_t magic, multiboot_info* mbi) {
extern print_stream_t vga_print_stream;
extern print_stream_t* kout;
@@ -39,6 +104,8 @@ void kmain(uint32_t magic, multiboot_info* mbi) {
}
kprintf("multiboot virtual address: 0x%x\n", mbi);
kprintf("parsing multiboot memory map\n");
uint32_t mmap_virtual_addr = mbi->mmap_addr + 0xC0000000;
kprintf("mmap virtual address: 0x%x\n", mmap_virtual_addr);
init_pmm((void*)mmap_virtual_addr, mbi->mmap_length);
@@ -70,8 +137,7 @@ void kmain(uint32_t magic, multiboot_info* mbi) {
init_page_tables();
kprintf("Page tables initialized\n");
user_page_directories[0] = create_user_pd();
kprintf("Created first user process page directory @ 0x%x\n", user_page_directories[0]);
load_origin_program(mbi);
while(1);
}