/************************************************************************************** Copyright (c) 2002 The UbixOS Project $Id$ **************************************************************************************/ #include <vmm/paging.h> unsigned int *pageDirectory = 0x0; int memoryStart = 0x100000; void initPaging() { int i = 0; unsigned int *pageTable; int freePage = 0x0; pageDirectory = (unsigned int*)allocPage(); for (i=0;i<pageLength;i++) { pageDirectory[i] = 0x0; } pageTable = (unsigned int*)allocPage(); pageDirectory[0] = (unsigned int)pageTable | pageDefault; for (i=0;i<1024;i++) { pageTable[i] = 0x0; } for (i=0;i<1024;i++) { pageTable[i] = freePage | 7; freePage += 0x1000; } asm( "movl %0,%%eax \n" "movl %%eax,%%cr3 \n" "movl %%cr0,%%eax \n" "orl $0x80000000,%%eax \n" "movl %%eax,%%cr0 \n" : : "d" ((unsigned int *)(pageDirectory)) ); } unsigned int allocPage() { unsigned int page; if (memoryStart%4096 != 0) { memoryStart += 4096 - memoryStart%4096; } page = memoryStart; memoryStart += 4096; return(page); } void pageFault() { while (1); }