Commit ca531e3d by triazo

Maps kernel into virtual space

parent 83769971
Showing with 21 additions and 0 deletions
...@@ -57,6 +57,9 @@ void load_elf(elf_header* elf_start) ...@@ -57,6 +57,9 @@ void load_elf(elf_header* elf_start)
} }
} }
// Map the kernel 1:1 in memory
page_region(pgdir, 0x0, &_kernel_end);
// Allocate two more pages for stack // Allocate two more pages for stack
page_map(pgdir, highest_vpage + 0x1000); page_map(pgdir, highest_vpage + 0x1000);
page_map(pgdir, highest_vpage + 0x2000); page_map(pgdir, highest_vpage + 0x2000);
......
...@@ -85,6 +85,23 @@ void page_everything(page_directory_entry* pg_dir) ...@@ -85,6 +85,23 @@ void page_everything(page_directory_entry* pg_dir)
} }
} }
// page_region adds page tables to map to real memory for a region
void page_region(page_directory_entry pgdir[], void* begin, void* end)
{
for (void* page = begin; page < end; page += 0x1000)
{
if ((pgdir[(uint32_t)page>>22] & 0xfffff000) == 0)
{
pgdir[(uint32_t)page>>22] |= (page_directory_entry)page_new_table();
}
page_table_entry* page_table = (page_table_entry*) ((uint32_t) pgdir[(uint32_t)page>>22] & 0xfffff000);
if ((page_table[((uint32_t)page >> 12) % 1024] & 0xfffff000) == 0)
{
page_table[((uint32_t)page>>12)%1024] |= (page_table_entry)page;
}
}
}
// This goes through all available memory, and maps 1 to 1 virtual memory to it. // This goes through all available memory, and maps 1 to 1 virtual memory to it.
page_directory_entry* mem_init_kern_tables(multiboot_memory_map* mmap, multiboot_memory_map* mmap_end) page_directory_entry* mem_init_kern_tables(multiboot_memory_map* mmap, multiboot_memory_map* mmap_end)
{ {
......
...@@ -38,6 +38,7 @@ extern char _kernel_end[]; ...@@ -38,6 +38,7 @@ extern char _kernel_end[];
void* page_allocate(); void* page_allocate();
void page_free(void* page_start); void page_free(void* page_start);
void* page_map(page_directory_entry pgdir[], void* page_start); void* page_map(page_directory_entry pgdir[], void* page_start);
void page_region(page_directory_entry pgdir[], void* begin, void* end);
// Initilization // Initilization
void page_everything(page_directory_entry* pg_dir); void page_everything(page_directory_entry* pg_dir);
......
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