summaryrefslogtreecommitdiff
path: root/kernel/vmem.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/vmem.c')
-rw-r--r--kernel/vmem.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/kernel/vmem.c b/kernel/vmem.c
index c22f764..f9d6050 100644
--- a/kernel/vmem.c
+++ b/kernel/vmem.c
@@ -256,6 +256,44 @@ void vmem_init()
}
+ // 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;
+
+ virt_addr=0x8048000;
+ 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
+ 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;
+
+ }
x86_set_pdbr(dir);