summaryrefslogtreecommitdiff
path: root/kernel/vmem.c
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-11-28 14:26:17 +0100
committerMichal Idziorek <m.i@gmx.at>2014-11-28 14:26:17 +0100
commitb875bc86aac2c9a733ddb9b3db4ead94d2c4c053 (patch)
tree59b337e60288902a8d3237f4ac84a6898ba55d9f /kernel/vmem.c
parent7526cbb7ea06a1862c732d367a759917695e1f08 (diff)
struggling with paging ...
Diffstat (limited to 'kernel/vmem.c')
-rw-r--r--kernel/vmem.c129
1 files changed, 111 insertions, 18 deletions
diff --git a/kernel/vmem.c b/kernel/vmem.c
index f9d6050..3d62e97 100644
--- a/kernel/vmem.c
+++ b/kernel/vmem.c
@@ -83,6 +83,13 @@ typedef struct pdirectory_struct {
pd_entry m_entries[PAGES_PER_DIR];
}pdirectory;
+#define MAX_PAGEDIRS 10
+pdirectory *page_dirs[MAX_PAGEDIRS];
+int last_page_dir=0;
+int current_dir=0;
+
+////
+
void pt_entry_add_attrib (pt_entry* e, uint32_t attrib)
{
*e|=attrib;
@@ -98,6 +105,13 @@ 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)
+{
+ // *e = (*e & ~I86_PTE_FRAME) | addr;
+
+ return *e&I86_PTE_FRAME;
+
+}
bool pt_entry_is_present (pt_entry e)
{
return e&I86_PTE_PRESENT;
@@ -158,6 +172,7 @@ void pd_entry_enable_global (pd_entry e)
}
*/
+
uint8_t vmmngr_alloc_page (pt_entry* e)
{
@@ -208,6 +223,30 @@ void show_cr()
}
+uint32_t vmem_alloc_block_at(uint32_t virt_addr)
+{
+
+ uint32_t phys_addr=pmmngr_alloc_block(); // get free space from the memory manager
+ if (!phys_addr)panic(FOOLOS_MODULE_NAME,"unable to alloc spce");
+ pdirectory* dir = page_dirs[current_dir];
+ pd_entry* entry = &dir->m_entries [PAGE_DIRECTORY_INDEX (virt_addr) ];
+ if(entry==0)panic(FOOLOS_MODULE_NAME,"no table present at requested addr :(");
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"found entry at %08X",entry);
+
+ //! 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, phys_addr);
+
+ //! ...and add it to the page table
+ ptable *table=pt_entry_get_frame(entry);
+ table->m_entries [PAGE_TABLE_INDEX (virt_addr) ] = page;
+ return phys_addr;
+
+}
+
+
void vmem_init()
{
//log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"init paging (vesa base: 0x%08x)",vesa_physbase);
@@ -227,7 +266,6 @@ void vmem_init()
{
ptable* table = (ptable*) pmmngr_alloc_block ();
-
if (!table)panic(FOOLOS_MODULE_NAME,"unable to alloc table");
// log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"table: 0x%X",table);
@@ -256,10 +294,7 @@ void vmem_init()
}
- // programm space starts at 0x8048000 and let us reserve 4mb per programm!
- // lets start to build the directory for one single programm
-// uint32_t phys_addr=0;
-
+ // programm space (for init)
virt_addr=0x8048000;
for(int j=0;j<5;j++)
{
@@ -269,12 +304,11 @@ void vmem_init()
for (int i=0, virt=virt_addr; i<1024; i++, virt+=4096)
{
- phys_addr=pmmngr_alloc_block(); // get free space from the memory manager
+ phys_addr=pmmngr_alloc_block(); // get free space from the memory manager
if (!phys_addr)panic(FOOLOS_MODULE_NAME,"unable to alloc spce for frame");
int frame=phys_addr;
-
//! create a new page
pt_entry page=0;
pt_entry_add_attrib (&page, I86_PTE_PRESENT);
@@ -295,28 +329,87 @@ void vmem_init()
}
- x86_set_pdbr(dir);
+ page_dirs[last_page_dir++]=dir;
+
+ x86_set_pdbr(dir);
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"enabling paging...");
-
- show_cr();
-
x86_paging_enable();
- //vesa_set_physbase(vesa_mapped);
-
- show_cr();
-
}
-void set_vmem1()
+void vmem_set_dir(int dir)
{
-
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"set pagedir to %d",dir);
+ x86_set_pdbr(page_dirs[dir]);
+ current_dir=dir;
}
-void set_vmem2()
+
+int vmem_new_space_dir()
{
+ uint32_t vaddr=vmem_alloc_block_at(0xF0000000);
+ return 0;
+ pdirectory* dir = vaddr;
+ if (!dir)panic(FOOLOS_MODULE_NAME,"unable to alloc pdirectory");
+
+ for(int i=0;i<1024;i++)dir->m_entries [i]=0;
+ // first clone the kernel space!
+ for(int i=0;i<3;i++)
+ {
+ dir->m_entries[i]=page_dirs[0]->m_entries[i];
+
+
+ }
+ return 0;
+
+ // programm space starts at 0x8048000 and let us reserve 4mb per programm!
+ // lets start to build the directory for one single programm
+ // uint32_t phys_addr=0;
+ /*
+ uint32_t virt_addr=0x8048000;
+ uint32_t phys_addr;
+ for(int j=0;j<5;j++)
+ {
+
+ ptable* table = (ptable*) pmmngr_alloc_block ();
+ if (!table)panic(FOOLOS_MODULE_NAME,"unable to alloc table");
+
+ for (int i=0, virt=virt_addr; i<1024; i++, virt+=4096)
+ {
+ phys_addr=pmmngr_alloc_block(); // get free space from the memory manager
+ memcpy(phys_addr,virt_addr,4096); // duplicate current contents of this space!
+ //
+ if (!phys_addr)panic(FOOLOS_MODULE_NAME,"unable to alloc spce for frame");
+
+ int frame=phys_addr;
+
+
+ //! 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);
+
+ virt_addr+=1024*4096;
+
+ }
+ */
+ page_dirs[last_page_dir]=dir;
+ return last_page_dir++;
}
+
+