From c8032c1bf3a951cbd7aaef8b9a03b12aabd1f691 Mon Sep 17 00:00:00 2001 From: Michal Idziorek Date: Mon, 17 Nov 2014 22:54:48 +0100 Subject: identity paging re-enabled --- kernel/config.h | 2 +- kernel/kernel.c | 6 ++--- kernel/mem.c | 2 +- kernel/vmem.c | 84 ++++++++++++++++++++++++--------------------------------- kernel/vmem.h | 1 + 5 files changed, 40 insertions(+), 55 deletions(-) create mode 100644 kernel/vmem.h (limited to 'kernel') diff --git a/kernel/config.h b/kernel/config.h index 05c4bcb..039ced7 100644 --- a/kernel/config.h +++ b/kernel/config.h @@ -6,7 +6,7 @@ //#define FOOLOS_COMPILE_FLOPPY // compile floppy drivers #define FOOLOS_CONSOLE_AUTOBREAK // add newline automatically at end of line -#define FOOLOS_LOG_OFF // do not log anything +//#define FOOLOS_LOG_OFF // do not log anything #define FOOLOS_CONSOLE // otherwise VESA will be used! #define MEM_PRINT_MEMORYMAP #define LOG_BUF_SIZE 4069 diff --git a/kernel/kernel.c b/kernel/kernel.c index b45703a..a5bbfcc 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -12,6 +12,7 @@ #include "spinlock.h" #include "syscalls.h" #include "mem.h" +#include "vmem.h" #include "interrupts.h" #include "acpi.h" #include "mp.h" @@ -153,10 +154,7 @@ void kernel_main(uint32_t initial_stack, int mp) // // Activate Virtual Memory (paging) // - // paging (pass the vesa physbase address for identity mapping) - // TODO: we will work on this later (not needed so urgently yet) - // - //vmem_init(vesa_physbase); + vmem_init(); // // Scan the PCI Bus diff --git a/kernel/mem.c b/kernel/mem.c index 901f01b..9583246 100644 --- a/kernel/mem.c +++ b/kernel/mem.c @@ -224,7 +224,7 @@ void mem_init(uint16_t *memmap,uint16_t entries) } // here is somewhere our kernel stuff ;) // TODO!! better. - pmmngr_deinit_region(0x0,0x200000); + pmmngr_deinit_region(0x0,0x150000); // and here is the memory map that we JUST created! pmmngr_deinit_region(_mmngr_memory_map,mem_array_size*4); diff --git a/kernel/vmem.c b/kernel/vmem.c index e700da3..ceef26d 100644 --- a/kernel/vmem.c +++ b/kernel/vmem.c @@ -208,68 +208,54 @@ void show_cr() } -void vmem_init(uint32_t vesa_physbase) +void 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 (vesa base: 0x%08x)",vesa_physbase); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"init paging"); - ptable* table1 = (ptable*) pmmngr_alloc_block (); - - if (!table1)panic(FOOLOS_MODULE_NAME,"unable to alloc table1"); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"table1: 0x%X",table1); - - ptable* table2 = (ptable*) pmmngr_alloc_block (); - - if (!table1)panic(FOOLOS_MODULE_NAME,"unable to alloc table2"); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"table2: 0x%X",table2); - - // TODO: 3blocks? 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); - //! 1st 4mb are idenitity mapped - for (int i=0, frame=0x0, virt=0x00000000; i<1024; i++, frame+=4096, virt+=4096) - { - //! 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, frame); - - //! ...and add it to the page table - table2->m_entries [PAGE_TABLE_INDEX (virt) ] = page; - } + for(int i=0;i<1024;i++)dir->m_entries [i]=0; - //uint32_t vesa_mapped=0x1000*1024; - uint32_t vesa_mapped=vesa_physbase; + uint32_t phys_addr=0; + uint32_t virt_addr=0; - for (int i=0, frame=vesa_physbase, virt=vesa_mapped; i<1024; i++, frame+=4096, virt+=4096) + // first 10 pages are identity mapped + for(int i=0;i<16;i++) { - //! 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, frame); + ptable* table = (ptable*) pmmngr_alloc_block (); - //! ...and add it to the page table - table1->m_entries [PAGE_TABLE_INDEX (virt) ] = page; - } - - for(int i=0;i<1024;i++)dir->m_entries [i]=0; - - pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (vesa_mapped) ]; - *entry=0; - pd_entry_add_attrib (entry, I86_PDE_PRESENT); - pd_entry_add_attrib (entry, I86_PDE_WRITABLE); - pd_entry_set_frame (entry, (physical_addr)table1); + if (!table)panic(FOOLOS_MODULE_NAME,"unable to alloc table"); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"table: 0x%X",table); - pd_entry* entry2 = &dir->m_entries [PAGE_DIRECTORY_INDEX (0x00000000) ]; - *entry2=0; - pd_entry_add_attrib (entry2, I86_PDE_PRESENT); - pd_entry_add_attrib (entry2, I86_PDE_WRITABLE); - pd_entry_set_frame (entry2, (physical_addr)table2); + //! idenitity mapping + for (int i=0, frame=phys_addr, virt=virt_addr; i<1024; i++, frame+=4096, virt+=4096) + { + //! 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, frame); + + //! ...and add it to the page table + table->m_entries [PAGE_TABLE_INDEX (virt) ] = page; + } + + pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt_addr) ]; + *entry=0; + pd_entry_add_attrib (entry, I86_PDE_PRESENT); + pd_entry_add_attrib (entry, I86_PDE_WRITABLE); + pd_entry_set_frame (entry, (physical_addr)table); + + phys_addr+=1024*4096; + virt_addr+=1024*4096; + + } + x86_set_pdbr(dir); diff --git a/kernel/vmem.h b/kernel/vmem.h new file mode 100644 index 0000000..5d35a30 --- /dev/null +++ b/kernel/vmem.h @@ -0,0 +1 @@ +void vmem_init(); -- cgit v1.2.3