diff options
| -rw-r--r-- | kernel/mem.c | 6 | ||||
| -rw-r--r-- | kernel/vmem.c | 43 |
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) ]; |
