summaryrefslogtreecommitdiff
path: root/kernel
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
parent88c5873713a4eda47d299abd9cecaa49221ec9fe (diff)
start fixing virtual memory manager... (might take a while)v0.1
Diffstat (limited to 'kernel')
-rw-r--r--kernel/kernel.c11
-rw-r--r--kernel/mem.c11
-rw-r--r--kernel/scheduler.c2
-rw-r--r--kernel/vmem.c78
-rw-r--r--kernel/vmem.h38
5 files changed, 77 insertions, 63 deletions
diff --git a/kernel/kernel.c b/kernel/kernel.c
index 2fdb09b..d30abf0 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -72,16 +72,17 @@ void kernel_main(uint32_t eax,uint32_t ebx)
// -- MEMORY MANAGEMENT -- //
klog("Memory init ... ");
- uint32_t kernel_blocks=mem_init(cfg_multiboot);
+ mem_init(cfg_multiboot);
klog("Vritual Memory / Paging init ... ");
fixme("do not disable anymore on context switching!");
fixme("write convenneint management funcs as: mapCPU, mapKErnel, map USerspace..");
+ fixme("move stack and guard with empty pages!");
- pdirectory *dir=vmem_init(kernel_blocks,(uint32_t)cfg_multiboot->framebuffer_addr,cfg_acpi.local_apic_address,cfg_acpi.io_apic_address);
-
-
- fixme("move stack?");
+ struct pdirectory_struct *dir=vmem_init(0, // this is hardcoded to first 32megs anyway
+ (uint32_t)cfg_multiboot->framebuffer_addr,
+ cfg_acpi.local_apic_address,
+ cfg_acpi.io_apic_address);
// -- RAM IMAGE -- //
klog("Ram Filesystem init ... ");
diff --git a/kernel/mem.c b/kernel/mem.c
index 79cfe9b..a0650c6 100644
--- a/kernel/mem.c
+++ b/kernel/mem.c
@@ -205,15 +205,22 @@ uint32_t mem_init(multiboot_information *info)
klog("mod 0x%08X-0x%08X : %s",
mod->mod_start,mod->mod_end, mod->string);
- pmmngr_deinit_region(mod->mod_start,((uint32_t)mod->mod_end-(uint32_t)mod->mod_start)+1);
+ pmmngr_deinit_region(mod->mod_start,((uint32_t)mod->mod_end-(uint32_t)mod->mod_start));
mod++;
}
}
- // deinitialize kernel
+ // deinitialize kernel simply with this:
pmmngr_deinit_region(kernel_start,((uint32_t)kernel_end-(uint32_t)kernel_start)+1);
+ // or better via ELF symbols: (TODO!)
+ if(info->flags&&1<<5)
+ {
+ fixme("parse ELF sections of our kernel.");
+ }
+ else kpanic("Can not find ELF symbols.");
+
klog("Free 4K blocks: %d",mem_free_blocks);
klog("Usable ~%d / %d MB ",mem_free_blocks*4096/1024/1024,total_mem/1024/1024);
diff --git a/kernel/scheduler.c b/kernel/scheduler.c
index 0f511f4..8178c12 100644
--- a/kernel/scheduler.c
+++ b/kernel/scheduler.c
@@ -26,7 +26,7 @@ static volatile struct task_list_struct
volatile uint32_t parent; // parent process id
volatile uint32_t esp; // stack pointer of the task
volatile uint32_t esp0; // tss.esp0
- volatile pdirectory *vmem; // number of virtual memory table
+ volatile struct pdirectory *vmem; // number of virtual memory table
volatile uint32_t brk; // memory brk pos
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;
diff --git a/kernel/vmem.h b/kernel/vmem.h
index 2a8e7cc..4d00c3e 100644
--- a/kernel/vmem.h
+++ b/kernel/vmem.h
@@ -47,39 +47,11 @@
*
*/
-//! i86 architecture defines 1024 entries per table--do not change
-#define PAGES_PER_TABLE 1024
-#define PAGES_PER_DIR 1024
+#include <stdint.h>
-#define PAGE_DIRECTORY_INDEX(x) (((x) >> 22) & 0x3ff)
-#define PAGE_TABLE_INDEX(x) (((x) >> 12) & 0x3ff)
-#define PAGE_GET_PHYSICAL_ADDRESS(x) (*x & ~0xfff)
+struct pdirectory_struct;
-//! page table represents 4mb address space
-#define PTABLE_ADDR_SPACE_SIZE 0x400000
+struct pdirectory_struct* vmem_init(uint32_t kernel_blocks,uint32_t fb_addr,uint32_t apic_addr, uint32_t ioapic_addr);
+void vmem_free_dir(struct pdirectory_struct *dir);
+struct pdirectory_struct* vmem_new_space_dir(struct pdirectory_struct *copy_dir,bool stack_only);
-//! 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;
-
-pdirectory* vmem_init(uint32_t kernel_blocks,uint32_t fb_addr,uint32_t apic_addr, uint32_t ioapic_addr);
-void vmem_free_dir(pdirectory *dir);
-pdirectory* vmem_new_space_dir(pdirectory *copy_dir,bool stack_only);