Commit 574fd64b by triazo

Elf segment copying

parent ef50401d
Showing with 43 additions and 1 deletions
/*
elf.c
Mainly, contains the elf loading code
*/
#include "mem.h"
void load_elf(elf_header* elf_start)
{
// The elf will get its own memory space.
page_directory_entry* pgdir = page_new_directory();
// loop through and copy memory segments
for (int i = 0; i < elf_start->ph_entry_count; i++)
{
// get this section header
elf_program_header* ph;
ph = elf_start + elf_start->ph_table_offset + (i * elf_start->ph_entry_size);
// map and copy
for (pg = ph->p_vaddr & 0xfffff000; pg - ph->p_vaddr < ph->memory_segment_size; pg+=0x1000)
{
real_page = page_allocate(pg);
start = (pg > ph->p_vaddr) ? pg : ph->p_vaddr;
end = (pg + 0x1000 < ph->p_vaddr + ph->file_segment_size) ? pg + 0x1000 : ph->p_vaddr + ph->file_segment_size;
size = end - start;
offset = (pg > ph->p_vaddr) ? 0 : ph->p_vaddr - pg;
// do some memcpy stuff
memcpy(real_page + offset, start, size);
elf_start + p->ph_offset
}
}
}
......@@ -148,14 +148,17 @@ page_directory_entry* mem_init_kern_tables(multiboot_memory_map* mmap, multiboot
// that that address points to valid memory
void page_map(page_directory_entry[] pgdir, void* page_start)
{
void* page = 0;
if (pgdir[page_start>>22] & 0xfffff == 0)
{
pgdir[page_start>>22] |= page_new_table();
}
if (pgdir[page_start>>22][(page_start>>12)%1024] & 0xfffff == 0)
{
pgdir[page_start>>22][(page_start>>12)%1024] |= page_allocate();
page = page_allocate();
pgdir[page_start>>22][(page_start>>12)%1024] |= page;
}
return page;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment