diff options
Diffstat (limited to 'kernel/vmem.c')
| -rw-r--r-- | kernel/vmem.c | 38 |
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); |
