diff options
| author | Michal Idziorek <m.i@gmx.at> | 2014-12-03 22:54:35 +0100 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2014-12-03 22:54:35 +0100 |
| commit | b5d9da88991592d35d39dcae3829d2498b4e47e4 (patch) | |
| tree | 2be1ec075f489dc045310cace60d4c09340903b9 /kernel/vmem.c | |
| parent | 5435237fca6b7ab618bfc955e2973d7b325ff9dc (diff) | |
increased logger grnaularity and working on memory management
Diffstat (limited to 'kernel/vmem.c')
| -rw-r--r-- | kernel/vmem.c | 128 |
1 files changed, 20 insertions, 108 deletions
diff --git a/kernel/vmem.c b/kernel/vmem.c index 0cea40b..3acb806 100644 --- a/kernel/vmem.c +++ b/kernel/vmem.c @@ -1,12 +1,14 @@ // http://www.brokenthorn.com/Resources/OSDev18.html +// +#include <stdlib.h> #include "kernel.h" #include "x86.h" #include "mem.h" +#include "vmem.h" #include "lib/logger/log.h" // logger facilities #define FOOLOS_MODULE_NAME "vmem" - // TODO : why is the frame not 0xfffff?? enum PAGE_PTE_FLAGS { @@ -40,12 +42,6 @@ enum PAGE_PDE_FLAGS I86_PDE_FRAME = 0xFFFFF000 //1111111111111111111000000000000 }; -//! page table entry -typedef uint32_t pt_entry; - -//! a page directery entry -typedef uint32_t pd_entry; - //// //! virtual address @@ -53,41 +49,6 @@ typedef uint32_t virtual_addr; typedef uint32_t physical_addr; typedef uint8_t bool; - -//! i86 architecture defines 1024 entries per table--do not change -#define PAGES_PER_TABLE 1024 -#define PAGES_PER_DIR 1024 - -#define PAGE_DIRECTORY_INDEX(x) (((x) >> 22) & 0x3ff) -#define PAGE_TABLE_INDEX(x) (((x) >> 12) & 0x3ff) -#define PAGE_GET_PHYSICAL_ADDRESS(x) (*x & ~0xfff) - -//! page table represents 4mb address space -#define PTABLE_ADDR_SPACE_SIZE 0x400000 - -//! directory table represents 4gb address space -#define DTABLE_ADDR_SPACE_SIZE 0x100000000 - -//! page sizes are 4k -#define PAGE_SIZE 4096 - -//! page table -typedef struct ptable_struct { - - pt_entry m_entries[PAGES_PER_TABLE]; -}ptable ; - -//! page directory -typedef struct pdirectory_struct { - - pd_entry m_entries[PAGES_PER_DIR]; -}pdirectory; - -#define MAX_PAGEDIRS 10 -pdirectory *page_dirs[MAX_PAGEDIRS]; -int next_page_dir=0; -int current_dir=0; - //// void pt_entry_add_attrib (pt_entry* e, uint32_t attrib) @@ -210,57 +171,17 @@ pt_entry* vmmngr_ptable_lookup_entry (ptable* p, virtual_addr addr) return 0; } - -// TODO !? http://www.brokenthorn.com/Resources/OSDev18.html -/* -void vmmngr_map_page (void* phys, void* virt) +void vmem_free_dir(pdirectory *dir) { - } - -void show_cr() -{ - - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"cr0: 0x%08x",x86_get_cr0()); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"cr1: 0x%08x",x86_get_cr1()); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"cr2: 0x%08x",x86_get_cr2()); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"cr3: 0x%08x",x86_get_cr3()); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"cr4: 0x%08x",x86_get_cr4()); - -} - -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; - -} -*/ - // vmem init and also copies all the shit for FORK -volatile int vmem_new_space_dir(int copy_dir) +pdirectory* vmem_new_space_dir(pdirectory *copy_dir) { x86_paging_disable(); pdirectory* dir = (pdirectory*) pmmngr_alloc_block (); if (!dir)panic(FOOLOS_MODULE_NAME,"unable to alloc pdirectory"); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"pdirectory: 0x%X",dir); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"new pdirectory: 0x%X",dir); for(int i=0;i<1024;i++)dir->m_entries [i]=0; @@ -275,7 +196,7 @@ volatile int vmem_new_space_dir(int copy_dir) ptable* table; // create new tables on init - if(next_page_dir==0) + if(copy_dir==NULL) { // alloc space for our new table table = (ptable*) pmmngr_alloc_block (); @@ -305,7 +226,7 @@ volatile int vmem_new_space_dir(int copy_dir) else { dir->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)]= - page_dirs[0]->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)]; + copy_dir->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)]; } @@ -319,12 +240,12 @@ volatile int vmem_new_space_dir(int copy_dir) { ptable* table = (ptable*) pmmngr_alloc_block (); - pd_entry *oldentry= &(page_dirs[copy_dir]->m_entries[PAGE_DIRECTORY_INDEX(virt_addr)]); + 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_INFO,"oldtable at: 0x%08X",oldtable); + 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_INFO,"alloc table: %08X",table); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"alloc table: %08X",table); for (int i=0, virt=virt_addr; i<1024; i++, virt+=4096) { @@ -332,7 +253,7 @@ volatile int vmem_new_space_dir(int copy_dir) if (!phys_addr)panic(FOOLOS_MODULE_NAME,"unable to alloc spce for frame"); // if this is not init , copy contents from current space! - if(next_page_dir!=0) + 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); @@ -363,33 +284,24 @@ volatile int vmem_new_space_dir(int copy_dir) } - page_dirs[next_page_dir]=dir; - if(next_page_dir!=0)x86_paging_enable(); - return next_page_dir++; + if(copy_dir!=NULL)x86_paging_enable(); + return dir; } -void vmem_set_dir(int dir) +void vmem_set_dir(pdirectory *dir) { - x86_set_pdbr(page_dirs[dir]); - current_dir=dir; + x86_set_pdbr(dir); } -void vmem_init() +pdirectory* vmem_init() { - //log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"init paging (vesa base: 0x%08x)",vesa_physbase); log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"init paging"); - vmem_set_dir(vmem_new_space_dir(0)); + pdirectory *dir=vmem_new_space_dir(0); + vmem_set_dir(dir); x86_paging_enable(); - + return dir; } - - - - - - - |
