summaryrefslogtreecommitdiff
path: root/kernel/vmem.c
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-12-04 21:59:04 +0100
committerMichal Idziorek <m.i@gmx.at>2014-12-04 21:59:04 +0100
commit53a61ec0f257930c2c5eb2ba20cac53d7862c92b (patch)
treee97ee6d6d7cb1a1c2d88cfbe1211a2e02cecb4be /kernel/vmem.c
parent680c9c2548e6886dce57f2b4c83d88319442afa7 (diff)
own virtual address space for stack
Diffstat (limited to 'kernel/vmem.c')
-rw-r--r--kernel/vmem.c78
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();