summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/mem.c6
-rw-r--r--kernel/vmem.c43
2 files changed, 44 insertions, 5 deletions
diff --git a/kernel/mem.c b/kernel/mem.c
index bd0d143..62851c9 100644
--- a/kernel/mem.c
+++ b/kernel/mem.c
@@ -171,6 +171,12 @@ void pmmngr_free_block (void* p)
mmap_unset (frame);
mem_free_blocks++;
}
+ else
+ {
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_ERROR,"free block (%d) 0x%08X)",frame,addr);
+ panic(FOOLOS_MODULE_NAME,"trying to free, free physical mem!");
+
+ }
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"free block (%d) 0x%08X)",frame,addr);
}
diff --git a/kernel/vmem.c b/kernel/vmem.c
index 3a05598..a582991 100644
--- a/kernel/vmem.c
+++ b/kernel/vmem.c
@@ -173,12 +173,44 @@ pt_entry* vmmngr_ptable_lookup_entry (ptable* p, virtual_addr addr)
void vmem_free_dir(pdirectory *dir)
{
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"removing pdirectory: 0x%X",dir);
+ x86_paging_disable();
+
+ uint32_t virt_addr=0;
+
+ // first pages are identity mapped (kernel space) just remove links
+ for(int j=0;j<3;j++)
+ {
+ pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt_addr) ];
+ virt_addr+=1024*4096;
+ }
+
+ // programm space
+
+ virt_addr=0x8000000;
+ for(int j=0;j<2;j++)
+ {
+
+ pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt_addr) ];
+ ptable *table=pd_entry_get_frame(entry);
+
+ for (int i=0, virt=virt_addr; i<1024; i++, virt+=4096)
+ {
+ pt_entry pte=&table->m_entries [PAGE_TABLE_INDEX (virt) ];
+ pmmngr_free_block(pt_entry_get_frame(pte)); // get free space from the memory manager
+ }
+
+ pmmngr_free_block(pd_entry_get_frame (entry));
+ virt_addr+=1024*4096;
+
+ }
+
+ pmmngr_free_block(dir);
+
+ x86_paging_enable();
}
// vmem init and also copies all the shit for FORK
// for now it allocates always 2 * 1024 * 4096 bytes at
-// virtual: 0x80480000-0x8848000.
//
pdirectory* vmem_new_space_dir(pdirectory *copy_dir)
{
@@ -240,7 +272,7 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir)
}
// programm space
- virt_addr=0x8048000;
+ virt_addr=0x8000000;
for(int j=0;j<2;j++)
{
@@ -266,8 +298,7 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir)
}
-
- int frame=phys_addr;
+ uint32_t frame=phys_addr;
//! create a new page
pt_entry page=0;
@@ -275,8 +306,10 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir)
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) ];