summaryrefslogtreecommitdiff
path: root/kernel/vmem.c
diff options
context:
space:
mode:
authorMiguel <m.i@gmx.at>2018-09-10 01:41:28 +0200
committerMiguel <m.i@gmx.at>2018-09-10 01:41:28 +0200
commit67e7f93fc2ea9c6d04698f9af29be78d0123afb0 (patch)
tree8affeecb23719c39f8494eb87c1576b1f0d35c55 /kernel/vmem.c
parent88c5873713a4eda47d299abd9cecaa49221ec9fe (diff)
start fixing virtual memory manager... (might take a while)v0.1
Diffstat (limited to 'kernel/vmem.c')
-rw-r--r--kernel/vmem.c78
1 files changed, 56 insertions, 22 deletions
diff --git a/kernel/vmem.c b/kernel/vmem.c
index ffe9a8e..ff464ea 100644
--- a/kernel/vmem.c
+++ b/kernel/vmem.c
@@ -1,16 +1,49 @@
#include <stdlib.h>
#include "kernel.h"
+#include "vmem.h"
+
#include "asm_x86.h"
#include "mem.h"
-#include "vmem.h"
#include "kmalloc.h"
#include "lib/string/string.h"
+//! 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 4kb
+#define PAGE_SIZE 4096
+
+//! page table entry
+typedef uint32_t pt_entry;
+
+//! a page directery entry
+typedef uint32_t pd_entry;
+
+//! 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;
static uint32_t kernel_pages;
-uint32_t fb_addr;
-uint32_t apic_addr;
-uint32_t io_apic_addr;
+uint32_t fb_addr; // TODO!??!!? how can we share so ugly with vesa
+static uint32_t apic_addr;
+static uint32_t io_apic_addr;
// TODO : why is the frame not 0xfffff??
enum PAGE_PTE_FLAGS
@@ -50,59 +83,59 @@ typedef uint32_t virtual_addr;
typedef uint32_t physical_addr;
////
-void pt_entry_add_attrib (pt_entry* e, uint32_t attrib)
+static void pt_entry_add_attrib (pt_entry* e, uint32_t attrib)
{
*e|=attrib;
}
-void pt_entry_del_attrib (pt_entry* e, uint32_t attrib)
+static void pt_entry_del_attrib (pt_entry* e, uint32_t attrib)
{
*e&=~attrib;
}
-void pt_entry_set_frame (pt_entry* e , physical_addr addr)
+static 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)
+static physical_addr pt_entry_get_frame (pt_entry* e)
{
return *e&I86_PTE_FRAME;
}
-bool pt_entry_is_present (pt_entry e)
+static bool pt_entry_is_present (pt_entry e)
{
return e&I86_PTE_PRESENT;
}
-bool pt_entry_is_writable (pt_entry e)
+static bool pt_entry_is_writable (pt_entry e)
{
return e&I86_PTE_WRITABLE;
}
-physical_addr pt_entry_pfn (pt_entry e)
+static physical_addr pt_entry_pfn (pt_entry e)
{
return e&I86_PTE_FRAME;
}
-void pd_entry_add_attrib (pd_entry* e, uint32_t attrib)
+static void pd_entry_add_attrib (pd_entry* e, uint32_t attrib)
{
*e|=attrib;
}
-void pd_entry_del_attrib (pd_entry* e, uint32_t attrib)
+static void pd_entry_del_attrib (pd_entry* e, uint32_t attrib)
{
*e&=~attrib;
}
-void pd_entry_set_frame (pd_entry* e, physical_addr add)
+static void pd_entry_set_frame (pd_entry* e, physical_addr add)
{
*e|=I86_PDE_FRAME&add;
}
-physical_addr pd_entry_get_frame (pd_entry* e)
+static physical_addr pd_entry_get_frame (pd_entry* e)
{
return *e&I86_PDE_FRAME;
}
-bool pd_entry_is_present (pd_entry e)
+static bool pd_entry_is_present (pd_entry e)
{
return e&I86_PDE_PRESENT;
}
@@ -119,12 +152,12 @@ bool pd_entry_is_4mb (pd_entry e)
}
*/
-bool pd_entry_is_writable (pd_entry e)
+static bool pd_entry_is_writable (pd_entry e)
{
return e&I86_PDE_WRITABLE;
}
-physical_addr pd_entry_pfn (pd_entry e)
+static physical_addr pd_entry_pfn (pd_entry e)
{
return e&I86_PDE_FRAME;
}
@@ -135,7 +168,7 @@ void pd_entry_enable_global (pd_entry e)
}
*/
-uint8_t vmmngr_alloc_page (pt_entry* e)
+static uint8_t vmmngr_alloc_page (pt_entry* e)
{
// allocate a free physical frame
void* p = mem_alloc_block ();
@@ -148,14 +181,14 @@ uint8_t vmmngr_alloc_page (pt_entry* e)
return 1;
}
-void vmmngr_free_page (pt_entry* e)
+static void vmmngr_free_page (pt_entry* e)
{
void* p = (void*)pt_entry_pfn (*e);
if (p) mem_free_block (p);
pt_entry_del_attrib (e, I86_PTE_PRESENT);
}
-pt_entry* vmmngr_ptable_lookup_entry (ptable* p, virtual_addr addr)
+static pt_entry* vmmngr_ptable_lookup_entry (ptable* p, virtual_addr addr)
{
if (p) return &p->m_entries[ PAGE_TABLE_INDEX (addr) ];
return 0;
@@ -236,7 +269,7 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only)
x86_paging_disable();
//
- pdirectory* dir = (pdirectory*) kballoc(1);
+ pdirectory* dir = (pdirectory*) kballoc(1);
klog("new pdirectory: 0x%X",dir);
if (!dir)kpanic("unable to alloc pdirectory");
@@ -588,6 +621,7 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only)
pdirectory* vmem_init(uint32_t kernel_blocks, uint32_t frameb_addr, uint32_t apic_ad, uint32_t ioapic_ad)
{
+ fixme("do not share fb_addr with syscalls like that!");
fb_addr=frameb_addr;
apic_addr=apic_ad;
io_apic_addr=ioapic_ad;