diff options
Diffstat (limited to 'kernel/mm/virtual_mm/virtual_mm.c')
-rw-r--r-- | kernel/mm/virtual_mm/virtual_mm.c | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/kernel/mm/virtual_mm/virtual_mm.c b/kernel/mm/virtual_mm/virtual_mm.c index d8d3d70..cfa32e1 100644 --- a/kernel/mm/virtual_mm/virtual_mm.c +++ b/kernel/mm/virtual_mm/virtual_mm.c @@ -33,7 +33,7 @@ uint32_t *current_page_directory = 0; ALWAYS_INLINE void virtual_mm_load_page_directory(uint32_t *page_directory) { - __asm__("movl %0, %%eax" ::"r"(page_directory)); + __asm__("movl %0, %%cr3" ::"r"(page_directory)); } bool @@ -64,10 +64,10 @@ virtual_mm_initialize(void) ASSERT_NOT_REACHED(); for (uint32_t i = 0; i < 1024; i++) - table[i] = 0; + table[i] = 0x2; /* Identity map the first 4MiB (maps 4KiB 1024 times) */ - for (uint32_t i = 0, physical_addr = 0, virtual_addr = 0; i < 1024; + /* for (uint32_t i = 0, physical_addr = 0, virtual_addr = 0; i < 1024; i++, physical_addr += 4096, virtual_addr += 4096) { uint32_t pt_entry = 0; ADD_ATTRIB(&pt_entry, SET_PTE_PRESENT(1)); @@ -76,7 +76,16 @@ virtual_mm_initialize(void) table[PAGE_TABLE_INDEX(virtual_addr)] = pt_entry; } - printk("debug", "Page table is at: 0x%x", table); + printk("debug", "Page table is at: 0x%x", table); */ + + for (uint32_t i = 0; i < 1024; i++) { + uint32_t pt_entry = 0; + ADD_ATTRIB(&pt_entry, SET_PTE_PRESENT(1)); + ADD_ATTRIB(&pt_entry, SET_PTE_WRITABLE(1)); + ADD_ATTRIB(&pt_entry, SET_PTE_FRAME(i)); + + table[i] = pt_entry; + } uint32_t *page_directory = physical_mm_allocate_block(); if (!page_directory) @@ -85,13 +94,15 @@ virtual_mm_initialize(void) for (uint32_t i = 0; i < 1024; i++) page_directory[i] = 0; - uint32_t *pd_entry = &page_directory[PAGE_DIRECTORY_INDEX(0)]; + /* uint32_t *pd_entry = &page_directory[0]; ADD_ATTRIB(pd_entry, SET_PDE_PRESENT(1)); ADD_ATTRIB(pd_entry, SET_PDE_WRITABLE(1)); - ADD_ATTRIB(pd_entry, SET_PDE_FRAME((uint32_t) table)); + ADD_ATTRIB(pd_entry, SET_PDE_FRAME((uint32_t) table)); */ + page_directory[0] = ((uint32_t) table) | 3; printk("debug", "Page directory is at: 0x%x", page_directory); - printk("debug", "pd_entry: 0x%x", pd_entry); + // printk("debug", "pd_entry: 0x%x", pd_entry); + printk("debug", "513th entry: 0x%x", table[513]); virtual_mm_switch_page_directory(page_directory); virtual_mm_enable_paging(); |