diff --git a/src/bin/init/Makefile b/src/bin/init/Makefile index 7b593c1..e734202 100755 --- a/src/bin/init/Makefile +++ b/src/bin/init/Makefile @@ -3,7 +3,7 @@ #Compiler -GCC = gcc +GCC = gcc G++ = gcc #Linker diff --git a/src/bin/init/main.c b/src/bin/init/main.c index bf42608..d9c6141 100755 --- a/src/bin/init/main.c +++ b/src/bin/init/main.c @@ -34,16 +34,21 @@ int main() { int i=0; + char *test = 0x080499c9; i = getpid(); if (getpid() != 1) { printf("Sorry This Program Must Be Started By The Kernel!!!!\n"); + while(1); exit(1); } printf("Initializing system.\n"); if (!fork()) { + printf("Child\n"); //exec("shell"); while(1); } + test[0] = 'c'; + printf("Parent\n"); while(1); exit(1); } \ No newline at end of file diff --git a/src/sys/include/vmm/memory.h b/src/sys/include/vmm/memory.h index b2c627d..52686a0 100755 --- a/src/sys/include/vmm/memory.h +++ b/src/sys/include/vmm/memory.h @@ -30,9 +30,10 @@ #define memNotavail 2 typedef struct { - unsigned long pageAddr; - unsigned short status; - unsigned short pid; + uLong pageAddr; + uShort status; + int pid; + int cowCounter; } mMap; extern mMap *memoryMap; @@ -40,9 +41,8 @@ extern int freePages; int countMemory(); -unsigned long findFreePage(int pid); +uLong findFreePage(int pid); void initMmap(); -//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 10829dd..ddd7b06 100755 --- a/src/sys/include/vmm/paging.h +++ b/src/sys/include/vmm/paging.h @@ -32,6 +32,8 @@ #define pagePresent 0x00000001 #define pageWrite 0x00000002 #define pageUser 0x00000004 +#define pageCow 0x00000200 +#define pageStack 0x00000400 #define pageDefault (pagePresent|pageWrite|pageUser) #define tablesBaseAddress 0xBFC00000 #define parentPageDirAddr 0x100000 @@ -42,11 +44,13 @@ void initPagingSystem(); void *createVirtualSpace(); +void *copyVirtualSpace(); void remapPage(uLong source,uLong dest); void freePage(uLong pageAddr); void unmapPage(uLong pageAddr,int flags); void *getFreePage(); void *getPhysicalAddr(uLong pageAddr); +void setPageAttribute(uLong pageAddr,int attributes); void pageFault(); void _pageFault(); diff --git a/src/sys/kernel/exec.c b/src/sys/kernel/exec.c index a4f2269..f60f6a0 100755 --- a/src/sys/kernel/exec.c +++ b/src/sys/kernel/exec.c @@ -107,6 +107,7 @@ //Now Lets Make A Clean Stack newLoc = (char *)0x5DC000; remapPage(findFreePage(_current->id),0x5DC000); + setPageAttribute(0x5DC000,(pageDefault | pageStack)); for (i=0;i<4096;i++) { newLoc[i] = 0x0; } diff --git a/src/sys/kernel/fork.c b/src/sys/kernel/fork.c index c181641..726b0ae 100755 --- a/src/sys/kernel/fork.c +++ b/src/sys/kernel/fork.c @@ -31,63 +31,30 @@ void sysFork() { kTask_t * newProcess = findTask(); pid_t cPid = newProcess->id; - uLong *pageDirsrc,*pageTablesrc,*stackSrc,*pageDirdst,*pageTabledst,*stackDst; - int i,x,*ret; - uChar *src,*dst; + int i = 0,*ret = 0x0; + uChar *src = 0x0,*dst = 0x0; asm("":"=b" (ret)); - schedule(); +// schedule(); src = (uChar *)&_current->tss; dst = (uChar *)&newProcess->tss; for (i=0;iid = cPid; - newProcess->status = READY; - while(1); - pageDirsrc = (uLong *)_current->tss.cr3; -// pageDirdst = (uLong *)allocPage(); - taskList[cPid].tss.cr3 = (long)pageDirdst; - for (i=0;i<1024;i++) { - if (pageDirsrc[i] > 0) { - pageTablesrc = (uLong *)(pageDirsrc[i] & 0xFFFFF000); -// pageDirdst[i] = allocPage() | pageDefault; - pageTabledst = (uLong *)(pageDirdst[i] & 0xFFFFF000); - for (x=0;x<1024;x++) { - if (pageTablesrc[x] > 0) { - if ((i < 768) && (i>=1)) { - pageTabledst[x] = (pageTablesrc[x] & 0xFFFFF000) | (pagePresent|pageUser); - //pageTablesrc[x] = (pageTablesrc[x] & 0xFFFFF000) | (pagePresent|pageUser); - } - else { - pageTabledst[x] = pageTablesrc[x]; - } - } - else { - pageTabledst[x] = 0x0; - } - } - } - else { - pageDirdst[i] = 0x0; - } - } - i = (_current->tss.esp & 0xFFFFF000)/(1024*4096); - pageTabledst = (uLong *) (pageDirdst[i] & 0xFFFFF000); - i = ((_current->tss.esp & 0xFFFFF000) - (((_current->tss.esp & 0xFFFFF000)/(1024*4096))*(1024*4096)))/4096; - //pageTabledst[i] = allocPage() | pageDefault; - stackDst = (uLong *) (pageTabledst[i] & 0xFFFFF000); - stackSrc = (uLong *) (_current->tss.esp & 0xFFFFF000); - for (i=0;i<1024;i++) { - stackDst[i] = stackSrc[i]; - } - schedule(); - taskList[cPid].tss.eip = _current->tss.eip; - taskList[cPid].status = RUNNING; + newProcess->status = EMPTY; + newProcess->tss.cr3 = (long)copyVirtualSpace(); + newProcess->tss.eip = &&childStart;// _current->tss.eip; + newProcess->status = RUNNING; +childStart: + kprintf("Pids: [%i][%i]\n",_current->id,cPid); + if (cPid == 0) { while(1); } if (_current->id == cPid) { ret[0] = 0; + return; } else { ret[0] = cPid; + return; } } diff --git a/src/sys/vmm/paging.c b/src/sys/vmm/paging.c index e8515ca..c816cd0 100755 --- a/src/sys/vmm/paging.c +++ b/src/sys/vmm/paging.c @@ -183,6 +183,8 @@ "movl %cr3,%eax\n" "movl %eax,%cr3\n" ); + //Return + return; } /************************************************************************ @@ -265,6 +267,164 @@ //Return Physical Address Of Page Directory return(newPageDirectoryAddress); } + +/************************************************************************ + +Function: void *copyVirtualSpace(); +Description: Creates A Copy Of A Virtual Space And Set All NON Kernel + Space To COW For A Fork This Will Also Alter The Parents + VM Space To Make That COW As Well +Notes: + +************************************************************************/ +void *copyVirtualSpace() { + void *newPageDirectoryAddress = 0x0; + uLong *parentPageDirectory = 0x0,*newPageDirectory = 0x0; + uLong *parentPageTable = 0x0,*newPageTable = 0x0; + uLong *parentStackPage = 0x0,*newStackPage = 0x0; + int x = 0,i = 0,s = 0; + //Set Address Of Parent Page Directory + parentPageDirectory = (uLong *)parentPageDirAddr; + //Allocate A New Page For The New Page Directory + newPageDirectory = (uLong *)getFreePage(); + //Set newPageDirectoryAddress To The Newly Created Page Directories Page + newPageDirectoryAddress = getPhysicalAddr((uLong)newPageDirectory); + //First Set Up A Flushed Page Directory + for (x=0;xid < 0) || (_current->id > numTasks)) { - pageDir = pageDirectory; - } - else { - pageDir = (long *)_current->tss.cr3; - } + uLong *src,*dst; + pageDir = (uLong *)parentPageDirAddr; + //Get Memory Address For Violation asm( "movl %%cr2,%%eax\n" "movl %%eax,%0\n" - : "=g" (cr2) + : "=g" (memAddr) ); - pi = cr2/(1024*4096); - page = (cr2-(pi*(1024*4096)))/4096; - if (pageDir[pi] == 0) { - kprintf("Dumb Ass You Forgot To Allocate Memory [%i]\n",cr2); + //Calculate The Page Directory Index + pageDirectoryIndex = (memAddr/(1024*4096)); + //Calculate The Page Table Index + pageTableIndex = ((memAddr-(pageDirectoryIndex*(1024*4096)))/4096); + if (pageDir[pageDirectoryIndex] == 0) { + //Creat A Routine For Non Mapped Memory + kprintf("Error: [%i]\n",memAddr); while (1); -// pageTable = (uLong *)allocPage(); - pageDir[pi] = (uLong)pageTable | pageDefault; - for (i=0;i<1024;i++) { - pageTable[i] = 0; - } -// pageTable[page] = allocPage() | pageDefault; } else { - pageTable = (uLong *)(pageDir[pi] & 0xFFFFF000); - if (pageTable[page] > 0) { - src = (uChar *) (pageTable[page] & 0xFFFFF000); - pageTable[page] = findFreePage(_current->id) | pageDefault; - dst = (uChar *) (pageTable[page] & 0xFFFFF000); - for (i=0;i<4096;i++) { + //Set pageTable To Point To Virtual Address Of Page Table + pageTable = (uLong *)(tablesBaseAddress + (4096 * pageDirectoryIndex)); + if (((uLong)pageTable[pageTableIndex] & pageCow) == pageCow) { + //Set Src To Base Address Of Page To Copy + src = (uLong *) ((1024*4096*pageDirectoryIndex) + (4096*pageTableIndex)); + //Allocate A Free Page For Destination + dst = (uLong *) getFreePage(); + //Copy Memory + for (i=0;iid) | pageDefault; + //Need To Create A Routine For Attempting To Access Non Mapped Memory + kprintf("Error: [%i]\n",memAddr); + while(1); } } asm(