51 lines
1.1 KiB
C
51 lines
1.1 KiB
C
/*----------------*\
|
|
|Nanite OS |
|
|
|Copyright (C) 2026|
|
|
|Xircon |
|
|
\*----------------*/
|
|
|
|
/*
|
|
* Virtual Memory Manager
|
|
*/
|
|
|
|
#include "vmm.h"
|
|
|
|
|
|
// Arch stuff
|
|
#ifdef __I686
|
|
#include <arch/i686/util.h>
|
|
#endif
|
|
|
|
#include <stdio.h>
|
|
#include <stdint.h>
|
|
#include <dri/serial.h>
|
|
|
|
extern uint16_t DEBUG_COM_PORT;
|
|
|
|
uint32_t Page_Directory[1024] __attribute__((aligned(4096)));
|
|
uint32_t Page_Table[1024] __attribute__((aligned(4096)));
|
|
|
|
/*Initializes Memory Paging **WARNING: CAN BORK THINGS WITHOUT MEM MANAGER***/
|
|
void Memory_Page_Init()
|
|
{
|
|
unsigned long address = 0;
|
|
unsigned int PDi;
|
|
|
|
Serial_Printf(DEBUG_COM_PORT, "MEMORY:> Inititalizing Memory Paging\n");
|
|
// Set entries to not Present
|
|
for(PDi=0; PDi<1024; PDi++) {
|
|
Page_Directory[PDi] = 0x00000002;
|
|
}
|
|
// Set R/W + Supervisor Flags For Table
|
|
unsigned int PTi;
|
|
for(PTi=0; PTi<1024; PTi++) {
|
|
Page_Table[PTi] = (PTi * 0x1000) | 3;
|
|
}
|
|
// Add Table to Directory & Set R/W Supervisor
|
|
Page_Directory[0] = ((unsigned int)Page_Table) | 3;
|
|
|
|
// Enable Paging
|
|
Write_CR3(Page_Directory);
|
|
Write_CR0(Read_CR0() | 0x80000000);
|
|
}
|