Newer
Older
ubix / src / sys / vmm / paging.c
@reddawg reddawg on 11 May 2002 1 KB Woot Woot
/**************************************************************************************
 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);
  }