diff options
Diffstat (limited to 'kernel/vmem.c')
| -rw-r--r-- | kernel/vmem.c | 84 |
1 files changed, 35 insertions, 49 deletions
diff --git a/kernel/vmem.c b/kernel/vmem.c index e700da3..ceef26d 100644 --- a/kernel/vmem.c +++ b/kernel/vmem.c @@ -208,68 +208,54 @@ void show_cr() } -void vmem_init(uint32_t vesa_physbase) +void vmem_init() { - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"init paging (vesa base: 0x%08x)",vesa_physbase); + //log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"init paging (vesa base: 0x%08x)",vesa_physbase); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"init paging"); - ptable* table1 = (ptable*) pmmngr_alloc_block (); - - if (!table1)panic(FOOLOS_MODULE_NAME,"unable to alloc table1"); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"table1: 0x%X",table1); - - ptable* table2 = (ptable*) pmmngr_alloc_block (); - - if (!table1)panic(FOOLOS_MODULE_NAME,"unable to alloc table2"); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"table2: 0x%X",table2); - - // TODO: 3blocks? pdirectory* dir = (pdirectory*) pmmngr_alloc_block (); if (!dir)panic(FOOLOS_MODULE_NAME,"unable to alloc pdirectory"); log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"pdirectory: 0x%X",dir); - //! 1st 4mb are idenitity mapped - for (int i=0, frame=0x0, virt=0x00000000; i<1024; i++, frame+=4096, virt+=4096) - { - //! create a new page - pt_entry page=0; - pt_entry_add_attrib (&page, I86_PTE_PRESENT); - pt_entry_add_attrib (&page, I86_PTE_WRITABLE); - pt_entry_set_frame (&page, frame); - - //! ...and add it to the page table - table2->m_entries [PAGE_TABLE_INDEX (virt) ] = page; - } + for(int i=0;i<1024;i++)dir->m_entries [i]=0; - //uint32_t vesa_mapped=0x1000*1024; - uint32_t vesa_mapped=vesa_physbase; + uint32_t phys_addr=0; + uint32_t virt_addr=0; - for (int i=0, frame=vesa_physbase, virt=vesa_mapped; i<1024; i++, frame+=4096, virt+=4096) + // first 10 pages are identity mapped + for(int i=0;i<16;i++) { - //! create a new page - pt_entry page=0; - pt_entry_add_attrib (&page, I86_PTE_PRESENT); - pt_entry_add_attrib (&page, I86_PTE_WRITABLE); - pt_entry_set_frame (&page, frame); + ptable* table = (ptable*) pmmngr_alloc_block (); - //! ...and add it to the page table - table1->m_entries [PAGE_TABLE_INDEX (virt) ] = page; - } - - for(int i=0;i<1024;i++)dir->m_entries [i]=0; - - pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (vesa_mapped) ]; - *entry=0; - pd_entry_add_attrib (entry, I86_PDE_PRESENT); - pd_entry_add_attrib (entry, I86_PDE_WRITABLE); - pd_entry_set_frame (entry, (physical_addr)table1); + if (!table)panic(FOOLOS_MODULE_NAME,"unable to alloc table"); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"table: 0x%X",table); - pd_entry* entry2 = &dir->m_entries [PAGE_DIRECTORY_INDEX (0x00000000) ]; - *entry2=0; - pd_entry_add_attrib (entry2, I86_PDE_PRESENT); - pd_entry_add_attrib (entry2, I86_PDE_WRITABLE); - pd_entry_set_frame (entry2, (physical_addr)table2); + //! idenitity mapping + for (int i=0, frame=phys_addr, virt=virt_addr; i<1024; i++, frame+=4096, virt+=4096) + { + //! create a new page + pt_entry page=0; + pt_entry_add_attrib (&page, I86_PTE_PRESENT); + pt_entry_add_attrib (&page, I86_PTE_WRITABLE); + pt_entry_set_frame (&page, frame); + + //! ...and add it to the page table + table->m_entries [PAGE_TABLE_INDEX (virt) ] = page; + } + + pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt_addr) ]; + *entry=0; + pd_entry_add_attrib (entry, I86_PDE_PRESENT); + pd_entry_add_attrib (entry, I86_PDE_WRITABLE); + pd_entry_set_frame (entry, (physical_addr)table); + + phys_addr+=1024*4096; + virt_addr+=1024*4096; + + } + x86_set_pdbr(dir); |
