This repository has been archived on 2025-04-11. You can view files and clone it, but cannot push or open issues or pull requests.
csce410pine64backup/MP3/MP3_Sources/page_table.C

91 lines
2.3 KiB
C

#include "assert.H"
#include "exceptions.H"
#include "console.H"
#include "paging_low.H"
#include "page_table.H"
PageTable * PageTable::current_page_table = NULL;
unsigned int PageTable::paging_enabled = 0;
ContFramePool * PageTable::kernel_mem_pool = NULL;
ContFramePool * PageTable::process_mem_pool = NULL;
unsigned long PageTable::shared_size = 0;
void PageTable::init_paging(ContFramePool * _kernel_mem_pool,
ContFramePool * _process_mem_pool,
const unsigned long _shared_size)
{
kernel_mem_pool = _kernel_mem_pool;
process_mem_pool = process_mem_pool;
shared_size = _shared_size;
Console::puts("\nInitialized Paging System\n");
}
PageTable::PageTable()
{
//kernel_mem_pool->get_frames(1); // Need to take one frame for page directory.
//page_directory = (unsigned long *) 0x32000; // Should be the starting address after 1st 2MB
page_directory = (unsigned long *) kernel_mem_pool->get_frames(1); // Should I get the address like this???
//unsigned long * page_table = (unsigned long *) 0x33000; // Should be 4kb after the page directory.
unsigned long * page_table = page_directory + 0x1000; // Might be able to just do this.
unsigned long tempaddr; // Temporary address iterator.
// We need to map the first 4MB.
for(unsigned int i = 0; i < 1024; i++)
{
page_table[i] = tempaddr | 3; // set bits 0 and 1 to present and read/write respectively
tempaddr += 4096; // 4096 = 4kb
}
// Fill first entry of page directory.
page_directory[0] = *page_table;
page_directory[0] = page_directory[0] | 3;
for(unsigned int j = 1; j < 1024; j++)
{
page_directory[j] = 0 | 2;
}
current_page_table = this;
Console::puts("\nConstructed Page Table object\n");
}
void PageTable::load()
{
write_cr3(*page_directory);
current_page_table = this;
Console::puts("\nLoaded page table\n");
}
void PageTable::enable_paging()
{
write_cr3(*current_page_table->page_directory);
write_cr0(read_cr0() | 0x80000000);
paging_enabled = read_cr0();
Console::puts("\nEnabled paging\n");
}
void PageTable::handle_fault(REGS * _r)
{
/*
unsigned long tempframe = process_mem_pool->get_frames(1);
Console::puts("\nerror code: ");
Console::puti(_r->err_code);
unsigned char mask = 0x00;
read_cr2();
*/
assert(false);
Console::puts("\nhandled page fault\n");
}