diff options
Diffstat (limited to 'kernel/vmem.c')
| -rw-r--r-- | kernel/vmem.c | 129 |
1 files changed, 111 insertions, 18 deletions
diff --git a/kernel/vmem.c b/kernel/vmem.c index f9d6050..3d62e97 100644 --- a/kernel/vmem.c +++ b/kernel/vmem.c @@ -83,6 +83,13 @@ typedef struct pdirectory_struct { pd_entry m_entries[PAGES_PER_DIR]; }pdirectory; +#define MAX_PAGEDIRS 10 +pdirectory *page_dirs[MAX_PAGEDIRS]; +int last_page_dir=0; +int current_dir=0; + +//// + void pt_entry_add_attrib (pt_entry* e, uint32_t attrib) { *e|=attrib; @@ -98,6 +105,13 @@ void pt_entry_set_frame (pt_entry* e , physical_addr addr) *e|=I86_PTE_FRAME&addr; } +physical_addr pt_entry_get_frame (pt_entry* e) +{ + // *e = (*e & ~I86_PTE_FRAME) | addr; + + return *e&I86_PTE_FRAME; + +} bool pt_entry_is_present (pt_entry e) { return e&I86_PTE_PRESENT; @@ -158,6 +172,7 @@ void pd_entry_enable_global (pd_entry e) } */ + uint8_t vmmngr_alloc_page (pt_entry* e) { @@ -208,6 +223,30 @@ void show_cr() } +uint32_t vmem_alloc_block_at(uint32_t virt_addr) +{ + + uint32_t phys_addr=pmmngr_alloc_block(); // get free space from the memory manager + if (!phys_addr)panic(FOOLOS_MODULE_NAME,"unable to alloc spce"); + pdirectory* dir = page_dirs[current_dir]; + pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt_addr) ]; + if(entry==0)panic(FOOLOS_MODULE_NAME,"no table present at requested addr :("); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"found entry at %08X",entry); + + //! 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, phys_addr); + + //! ...and add it to the page table + ptable *table=pt_entry_get_frame(entry); + table->m_entries [PAGE_TABLE_INDEX (virt_addr) ] = page; + return phys_addr; + +} + + void vmem_init() { //log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"init paging (vesa base: 0x%08x)",vesa_physbase); @@ -227,7 +266,6 @@ void vmem_init() { ptable* table = (ptable*) pmmngr_alloc_block (); - if (!table)panic(FOOLOS_MODULE_NAME,"unable to alloc table"); // log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"table: 0x%X",table); @@ -256,10 +294,7 @@ 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; - + // programm space (for init) virt_addr=0x8048000; for(int j=0;j<5;j++) { @@ -269,12 +304,11 @@ void vmem_init() for (int i=0, virt=virt_addr; i<1024; i++, virt+=4096) { - phys_addr=pmmngr_alloc_block(); // get free space from the memory manager + 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); @@ -295,28 +329,87 @@ void vmem_init() } - x86_set_pdbr(dir); + page_dirs[last_page_dir++]=dir; + + x86_set_pdbr(dir); log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"enabling paging..."); - - show_cr(); - x86_paging_enable(); - //vesa_set_physbase(vesa_mapped); - - show_cr(); - } -void set_vmem1() +void vmem_set_dir(int dir) { - + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"set pagedir to %d",dir); + x86_set_pdbr(page_dirs[dir]); + current_dir=dir; } -void set_vmem2() + +int vmem_new_space_dir() { + uint32_t vaddr=vmem_alloc_block_at(0xF0000000); + return 0; + pdirectory* dir = vaddr; + if (!dir)panic(FOOLOS_MODULE_NAME,"unable to alloc pdirectory"); + + for(int i=0;i<1024;i++)dir->m_entries [i]=0; + // first clone the kernel space! + for(int i=0;i<3;i++) + { + dir->m_entries[i]=page_dirs[0]->m_entries[i]; + + + } + return 0; + + // 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; + /* + uint32_t virt_addr=0x8048000; + uint32_t phys_addr; + 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 + memcpy(phys_addr,virt_addr,4096); // duplicate current contents of this space! + // + 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; + + } + */ + page_dirs[last_page_dir]=dir; + return last_page_dir++; } + + |
