- 1 block = 4096 bytes : because this will make page fault handling possibly somewhat easier - 1 byte in the bitmap = 8 blocks of physical memory unsure if the allocation is perfect ... guess i'll find out some day if this is actually correct. The bitmap needs 16kb to keep track of 2gb of physical memory. Seems a decent percentage to me.
44 lines
1.4 KiB
C++
44 lines
1.4 KiB
C++
#include "PageDirectory.h"
|
|
|
|
void PageDirectory::enable()
|
|
{
|
|
|
|
|
|
// https://wiki.osdev.org/Setting_Up_Paging
|
|
//set each entry to not present
|
|
// int i;
|
|
// for(i = 0; i < 1024; i++)
|
|
// {
|
|
// // This sets the following flags to the pages:
|
|
// // Supervisor: Only kernel-mode can access them
|
|
// // Write Enabled: It can be both read from and written to
|
|
// // Not Present: The page table is not present
|
|
// this->page_directory[i] = 0x00000002;
|
|
// }
|
|
|
|
// // holds the physical address where we want to start mapping these pages to.
|
|
// // in this case, we want to map these pages to the very beginning of memory.
|
|
|
|
// //we will fill all 1024 entries in the table, mapping 4 megabytes
|
|
// for(unsigned int i = 0; i < 1024; i++)
|
|
// {
|
|
// // As the address is page aligned, it will always leave 12 bits zeroed.
|
|
// // Those bits are used by the attributes ;)
|
|
// first_page_table[i] = (i * 0x1000) | 3; // attributes: supervisor level, read/write, present.
|
|
// }
|
|
|
|
// // attributes: supervisor level, read/write, present
|
|
// this->page_directory[0] = ((unsigned int)first_page_table) | 3;
|
|
|
|
printf("Enable Paging!\n");
|
|
|
|
loadPageDirectory(this->page_directory);
|
|
enablePaging();
|
|
}
|
|
|
|
|
|
void PageDirectory::MapPhysicalToVirtualAddress ( address_t PAddress , address_t VAddress, uint32_t size )
|
|
{
|
|
|
|
}
|