diff options
| author | Miguel <m.i@gmx.at> | 2018-09-10 01:41:28 +0200 |
|---|---|---|
| committer | Miguel <m.i@gmx.at> | 2018-09-10 01:41:28 +0200 |
| commit | 67e7f93fc2ea9c6d04698f9af29be78d0123afb0 (patch) | |
| tree | 8affeecb23719c39f8494eb87c1576b1f0d35c55 /kernel/vmem.c | |
| parent | 88c5873713a4eda47d299abd9cecaa49221ec9fe (diff) | |
start fixing virtual memory manager... (might take a while)v0.1
Diffstat (limited to 'kernel/vmem.c')
| -rw-r--r-- | kernel/vmem.c | 78 |
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; |
