diff options
Diffstat (limited to 'kernel/vmem.c')
| -rw-r--r-- | kernel/vmem.c | 90 |
1 files changed, 20 insertions, 70 deletions
diff --git a/kernel/vmem.c b/kernel/vmem.c index 3d62e97..3079733 100644 --- a/kernel/vmem.c +++ b/kernel/vmem.c @@ -206,7 +206,9 @@ pt_entry* vmmngr_ptable_lookup_entry (ptable* p, virtual_addr addr) return 0; } + // TODO !? http://www.brokenthorn.com/Resources/OSDev18.html +/* void vmmngr_map_page (void* phys, void* virt) { @@ -245,13 +247,12 @@ uint32_t vmem_alloc_block_at(uint32_t virt_addr) return phys_addr; } +*/ - -void vmem_init() +int vmem_new_space_dir() { - //log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"init paging (vesa base: 0x%08x)",vesa_physbase); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"init paging"); - + x86_paging_disable(); + 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); @@ -296,11 +297,12 @@ void vmem_init() // programm space (for init) virt_addr=0x8048000; - for(int j=0;j<5;j++) + for(int j=0;j<2;j++) { ptable* table = (ptable*) pmmngr_alloc_block (); if (!table)panic(FOOLOS_MODULE_NAME,"unable to alloc table"); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"alloc table: %08X",table); for (int i=0, virt=virt_addr; i<1024; i++, virt+=4096) { @@ -329,86 +331,34 @@ void vmem_init() } - page_dirs[last_page_dir++]=dir; - - - x86_set_pdbr(dir); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"enabling paging..."); - x86_paging_enable(); + page_dirs[last_page_dir]=dir; + if(last_page_dir!=0)x86_paging_enable(); + return last_page_dir++; } void vmem_set_dir(int dir) { - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"set pagedir to %d",dir); + x86_paging_disable(); x86_set_pdbr(page_dirs[dir]); + // log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"set pagedir to %d (0x%08X)",dir,page_dirs[dir]); current_dir=dir; + x86_paging_enable(); } -int vmem_new_space_dir() -{ - uint32_t vaddr=vmem_alloc_block_at(0xF0000000); - return 0; - pdirectory* dir = vaddr; - if (!dir)panic(FOOLOS_MODULE_NAME,"unable to alloc pdirectory"); - - for(int i=0;i<1024;i++)dir->m_entries [i]=0; - - // first clone the kernel space! - for(int i=0;i<3;i++) - { - dir->m_entries[i]=page_dirs[0]->m_entries[i]; +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"); + vmem_set_dir(vmem_new_space_dir()); - } - return 0; - - // programm space starts at 0x8048000 and let us reserve 4mb per programm! - // lets start to build the directory for one single programm - // uint32_t phys_addr=0; - /* - uint32_t virt_addr=0x8048000; - uint32_t phys_addr; - for(int j=0;j<5;j++) - { - - ptable* table = (ptable*) pmmngr_alloc_block (); - if (!table)panic(FOOLOS_MODULE_NAME,"unable to alloc table"); - - for (int i=0, virt=virt_addr; i<1024; i++, virt+=4096) - { - phys_addr=pmmngr_alloc_block(); // get free space from the memory manager - memcpy(phys_addr,virt_addr,4096); // duplicate current contents of this space! - // - if (!phys_addr)panic(FOOLOS_MODULE_NAME,"unable to alloc spce for frame"); - - int frame=phys_addr; +} - //! 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); - - virt_addr+=1024*4096; - } - */ - page_dirs[last_page_dir]=dir; - return last_page_dir++; -} |
