summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-11-17 22:54:48 +0100
committerMichal Idziorek <m.i@gmx.at>2014-11-17 22:54:48 +0100
commitc8032c1bf3a951cbd7aaef8b9a03b12aabd1f691 (patch)
treeedddfddc7054775bee81ac9d1e8d6d84f8477ace
parent9c98882150b903343afb349e74ee850bfa16b5c2 (diff)
identity paging re-enabled
-rw-r--r--kernel/config.h2
-rw-r--r--kernel/kernel.c6
-rw-r--r--kernel/mem.c2
-rw-r--r--kernel/vmem.c84
-rw-r--r--kernel/vmem.h1
5 files changed, 40 insertions, 55 deletions
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();