diff options
| -rw-r--r-- | Makefile | 1 | ||||
| -rw-r--r-- | kernel/kernel.c | 11 | ||||
| -rw-r--r-- | kernel/mem.c | 11 | ||||
| -rw-r--r-- | kernel/scheduler.c | 2 | ||||
| -rw-r--r-- | kernel/vmem.c | 78 | ||||
| -rw-r--r-- | kernel/vmem.h | 38 |
6 files changed, 78 insertions, 63 deletions
@@ -44,6 +44,7 @@ CFLAGS+= -Werror CFLAGS+= -Werror=implicit-function-declaration CFLAGS+= -Wno-unused-variable +CFLAGS+= -Wno-unused-function CFLAGS+= -Wno-int-conversion CFLAGS+= -Wno-implicit-int CFLAGS+= -Wno-incompatible-pointer-types 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); |
