summaryrefslogtreecommitdiff
path: root/kernel/vmem.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/vmem.c')
-rw-r--r--kernel/vmem.c90
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++;
-}