diff --git a/src/sys/include/vmm/memory.h b/src/sys/include/vmm/memory.h index a579bc0..0326236 100755 --- a/src/sys/include/vmm/memory.h +++ b/src/sys/include/vmm/memory.h @@ -39,9 +39,9 @@ extern int numPages; int countMemory(); -unsigned long findFreepage(int pid); +unsigned long findFreePage(int pid); void initMmap(); -void freePage(unsigned long pageAddr); +//void freePage(unsigned long pageAddr); void freeProcesspages(int pid); #endif \ No newline at end of file diff --git a/src/sys/include/vmm/paging.h b/src/sys/include/vmm/paging.h index c3ca266..10829dd 100755 --- a/src/sys/include/vmm/paging.h +++ b/src/sys/include/vmm/paging.h @@ -26,22 +26,27 @@ #include -#define pageLength 0x00000400 -#define pageSize 4096 -#define pageEntries (pageSize/4) -#define pagePresent 0x00000001 -#define pageWrite 0x00000002 -#define pageUser 0x00000004 -#define pageDefault (pagePresent|pageWrite|pageUser) +#define pageLength 0x00000400 +#define pageSize 4096 +#define pageEntries (pageSize/4) +#define pagePresent 0x00000001 +#define pageWrite 0x00000002 +#define pageUser 0x00000004 +#define pageDefault (pagePresent|pageWrite|pageUser) +#define tablesBaseAddress 0xBFC00000 +#define parentPageDirAddr 0x100000 extern uLong *kernelPageDirectory; extern uLong *pageDirectory; extern uLong memoryStart; -//void initPaging(); void initPagingSystem(); -unsigned int allocPage(); +void *createVirtualSpace(); void remapPage(uLong source,uLong dest); +void freePage(uLong pageAddr); +void unmapPage(uLong pageAddr,int flags); +void *getFreePage(); +void *getPhysicalAddr(uLong pageAddr); void pageFault(); void _pageFault(); diff --git a/src/sys/kernel/exec.c b/src/sys/kernel/exec.c index d8856a8..58b0595 100755 --- a/src/sys/kernel/exec.c +++ b/src/sys/kernel/exec.c @@ -38,7 +38,7 @@ elfProgramheader *programHeader; newProcess = findTask(); pid = newProcess->id; - pdn = (uLong *)allocPage(); +// pdn = (uLong *)allocPage(); for (i=0;i<1024;i++) { pdn[i] = 0x0; } diff --git a/src/sys/kernel/schedule.c b/src/sys/kernel/schedule.c index c7235da..8ced83f 100755 --- a/src/sys/kernel/schedule.c +++ b/src/sys/kernel/schedule.c @@ -60,9 +60,9 @@ void initScheduler(void) { int i; for (i=0;i<(sizeof(kTask_t)*1024)/0x1000;i++) { - remapPage(allocPage(),(0xE0800000+(i*0x1000))); + remapPage(getFreePage(-1),(0xE0800000+(i*0x1000))); } - remapPage(allocPage(),(0xE0800000-0x1000)); + remapPage(getFreePage(-1),(0xE0800000-0x1000)); taskList[-1].id = -1; taskList[-1].status = EMPTY; for (i=0;iid); //Make Sure The Page Directory Is Clean for (i=0;iid); kernelPageDirectory[0] = (uLong)((uLong)(pageTable) | pageDefault); //Make Sure The Page Table Is Clean for (i=0;iid); //Make Sure The Page Table Is Clean for (x=0;xid),((x*(1024*4096))+(y*4096))); //Return The Address Of The Newly Allocate Page - return(((x*(1024*4096))+(y*4096))); + return((void *)((x*(1024*4096))+(y*4096))); } } } //If No Free Page Was Found Return NULL return(0x0); } -unsigned int allocPage() { - uLong page; - page = findFreepage(_current->id); - /* - if (memoryStart%4096 != 0) { - memoryStart += 4096 - memoryStart%4096; - } - page = memoryStart; - memoryStart += 4096; - */ - return(page); - } /************************************************************************ @@ -160,14 +297,14 @@ uShort destPageDirectoryIndex=0,destPageTableIndex=0; uLong *pageDir,*pageTable; //Set Pointer pageDirectory To Point To The Virtual Mapping Of The Page Directory - pageDir = (uLong *)0xC0000000; + pageDir = (uLong *)parentPageDirAddr; //Check To See If Page Table Exists destPageDirectoryIndex = (dest/(1024*4096)); if (pageDir[destPageDirectoryIndex] == 0) { //If Page Table Is Non Existant Then Set It Up - pageDir[destPageDirectoryIndex] = (uLong)allocPage() | pageDefault; + pageDir[destPageDirectoryIndex] = (uLong)findFreePage(_current->id) | pageDefault; //Also Add It To Virtual Space So We Can Make Changes Later - pageTable = (uLong *)(0xBFC00000 + (4096 * 767)); + pageTable = (uLong *)(tablesBaseAddress + (4096 * 767)); pageTable[destPageDirectoryIndex] = pageDir[destPageDirectoryIndex]; //Reload Page Directory asm( @@ -176,7 +313,7 @@ ); } //Set Address To Page Table - pageTable = (uLong *)(0xBFC00000 + (4096 * destPageDirectoryIndex)); + pageTable = (uLong *)(tablesBaseAddress + (4096 * destPageDirectoryIndex)); //Get The Index To The Page Table destPageTableIndex = ((dest-(destPageDirectoryIndex*(1024*4096)))/4096); //Set The Source Address In The Destination @@ -188,6 +325,18 @@ ); } +/************************************************************************ + +Function: void pageFault(); +Description: This Function Is The Second Half Of The Page Fault ISR + Currently It Handles COW However I Need To Prepar It For + Swapping +Notes: + +07/30/02 - Fixed COW However I Need To Think Of A Way To Impliment + A Paging System Also Start To Add Security Levels + +************************************************************************/ void pageFault() { uLong cr2 = 0,i = 0, page = 0,pi = 0; uLong *pageDir,*pageTable; @@ -208,25 +357,25 @@ if (pageDir[pi] == 0) { kprintf("Dumb Ass You Forgot To Allocate Memory [%i]\n",cr2); while (1); - pageTable = (uLong *)allocPage(); +// pageTable = (uLong *)allocPage(); pageDir[pi] = (uLong)pageTable | pageDefault; for (i=0;i<1024;i++) { pageTable[i] = 0; } - pageTable[page] = allocPage() | pageDefault; +// pageTable[page] = allocPage() | pageDefault; } else { pageTable = (uLong *)(pageDir[pi] & 0xFFFFF000); if (pageTable[page] > 0) { src = (uChar *) (pageTable[page] & 0xFFFFF000); - pageTable[page] = allocPage() | pageDefault; + pageTable[page] = findFreePage(_current->id) | pageDefault; dst = (uChar *) (pageTable[page] & 0xFFFFF000); for (i=0;i<4096;i++) { dst[i] = src[i]; } } else { - pageTable[page] = allocPage() | pageDefault; + pageTable[page] = findFreePage(_current->id) | pageDefault; } } asm( @@ -235,6 +384,13 @@ ); } +/************************************************************************ + +Function: void _pageFault() +Description: This Is The ASM Code That Calls The pageFault() Function +Notes: + +************************************************************************/ asm( ".global _pageFault \n" "_pageFault: \n"