summaryrefslogtreecommitdiff
path: root/kernel/vmem.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/vmem.c')
-rw-r--r--kernel/vmem.c128
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;
}
-
-
-
-
-
-
-