diff options
| author | Michal Idziorek <m.i@gmx.at> | 2014-12-04 21:59:04 +0100 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2014-12-04 21:59:04 +0100 |
| commit | 53a61ec0f257930c2c5eb2ba20cac53d7862c92b (patch) | |
| tree | e97ee6d6d7cb1a1c2d88cfbe1211a2e02cecb4be /kernel/vmem.c | |
| parent | 680c9c2548e6886dce57f2b4c83d88319442afa7 (diff) | |
own virtual address space for stack
Diffstat (limited to 'kernel/vmem.c')
| -rw-r--r-- | kernel/vmem.c | 78 |
1 files changed, 75 insertions, 3 deletions
diff --git a/kernel/vmem.c b/kernel/vmem.c index a582991..5dccc13 100644 --- a/kernel/vmem.c +++ b/kernel/vmem.c @@ -185,7 +185,6 @@ void vmem_free_dir(pdirectory *dir) } // programm space - virt_addr=0x8000000; for(int j=0;j<2;j++) { @@ -204,13 +203,36 @@ void vmem_free_dir(pdirectory *dir) } + // stack + virt_addr=0x8c00000; + for(int j=0;j<1;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 +// for now it allocates always 3 * 1024 * 4096 bytes at for the kernel +// virtual / physical 0x0-0xc00000 (~12MB) +// 2*1024*4096 for the loaded prog +// virtual 0x8000000-0x8800000 (~8MB) +// and 1*1024*4096 for the loaded programms stack +// 0x8c00000-0x9000000 (~4MB) // pdirectory* vmem_new_space_dir(pdirectory *copy_dir) { @@ -321,7 +343,57 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir) virt_addr+=1024*4096; } - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"last addr (0x%08X,0x%08X)",phys_addr, virt_addr); + + // programm space + virt_addr=0x8c00000; + for(int j=0;j<1;j++) + { + + ptable* table = (ptable*) pmmngr_alloc_block (); + pd_entry *oldentry= &(copy_dir->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)]); + ptable* oldtable=pd_entry_get_frame(oldentry); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"oldtable at: 0x%08X",oldtable); + + if (!table)panic(FOOLOS_MODULE_NAME,"unable to alloc table"); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"alloc table: %08X",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 + if (!phys_addr)panic(FOOLOS_MODULE_NAME,"unable to alloc spce for frame"); + + // if this is not init , copy contents from current space! + if(copy_dir!=NULL) + { + uint32_t addr_old=pt_entry_get_frame(&oldtable->m_entries[PAGE_TABLE_INDEX(virt)]); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_FINE,"physical memcpy(0x%08X,0x%08X,4096)",phys_addr, addr_old); + memcpy(phys_addr,addr_old,4096); + + } + + uint32_t 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; + + } if(copy_dir!=NULL)x86_paging_enable(); |
