diff --git a/src/bin/init/main.c b/src/bin/init/main.c index 06c0eb3..9ecc9b3 100755 --- a/src/bin/init/main.c +++ b/src/bin/init/main.c @@ -45,7 +45,9 @@ if (!fork()) { exec("shell"); printf("Error Starting Shell\n"); - while(1); + while(1) { + printf("."); + } } 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 52686a0..0f9a5bc 100755 --- a/src/sys/include/vmm/memory.h +++ b/src/sys/include/vmm/memory.h @@ -32,8 +32,8 @@ typedef struct { uLong pageAddr; uShort status; - int pid; - int cowCounter; + pid_t pid; + int cowCounter; } mMap; extern mMap *memoryMap; @@ -41,8 +41,9 @@ extern int freePages; int countMemory(); -uLong findFreePage(int pid); +uLong findFreePage(pid_t pid); void initMmap(); -void freeProcesspages(int pid); +void freeProcessPages(pid_t pid); +void adjustCowCounter(uLong baseAddr,int adjustment); #endif \ No newline at end of file diff --git a/src/sys/include/vmm/paging.h b/src/sys/include/vmm/paging.h index ddd7b06..1efa7a3 100755 --- a/src/sys/include/vmm/paging.h +++ b/src/sys/include/vmm/paging.h @@ -43,12 +43,12 @@ extern uLong memoryStart; void initPagingSystem(); -void *createVirtualSpace(); -void *copyVirtualSpace(); +void *createVirtualSpace(pid_t pid); +void *copyVirtualSpace(pid_t pid); void remapPage(uLong source,uLong dest); void freePage(uLong pageAddr); void unmapPage(uLong pageAddr,int flags); -void *getFreePage(); +void *getFreePage(pid_t pid); void *getPhysicalAddr(uLong pageAddr); void setPageAttribute(uLong pageAddr,int attributes); void pageFault(); diff --git a/src/sys/kernel/exec.c b/src/sys/kernel/exec.c index f4dd6b0..03ebc5e 100755 --- a/src/sys/kernel/exec.c +++ b/src/sys/kernel/exec.c @@ -54,7 +54,7 @@ //Get A New Task For This Proccess _current = findTask(); //Now We Must Create A Virtual Space For This Proccess To Run In - _current->tss.cr3 = (uLong)createVirtualSpace(); + _current->tss.cr3 = (uLong)createVirtualSpace(_current->id); //To Better Load This Application We Will Switch Over To Its VM Space asm( "movl %0,%%eax \n" diff --git a/src/sys/kernel/fork.c b/src/sys/kernel/fork.c index 7eeb93d..459e88a 100755 --- a/src/sys/kernel/fork.c +++ b/src/sys/kernel/fork.c @@ -64,7 +64,6 @@ newProcess->tss.ldt = 0x18; newProcess->tss.trace_bitmap = 0x80000000; //Create A Copy Of The VM Space For New Task - newProcess->tss.cr3 = (long)copyVirtualSpace(); newProcess->tss.eip = (long)&&childStart; //Set EBP And ESP To The Correct Locations asm( @@ -73,6 +72,7 @@ : : "g" (newProcess->tss.esp), "g" (newProcess->tss.ebp) ); + newProcess->tss.cr3 = (long)copyVirtualSpace(newProcess->id); newProcess->status = RUNNING; childStart: //Set Up Pointer to Return Value diff --git a/src/sys/kernel/kmalloc.c b/src/sys/kernel/kmalloc.c index 3e9e4c5..b2ce7a6 100755 --- a/src/sys/kernel/kmalloc.c +++ b/src/sys/kernel/kmalloc.c @@ -25,6 +25,7 @@ #include #include #include +#include struct memDescriptor { void *page; @@ -39,7 +40,7 @@ void initMalloc() { int i = 0; struct memDescriptor *tmpDesc = 0x0; - kernDesc = (void *)getFreePage(); + kernDesc = (void *)getFreePage(_current->id); tmpDesc = kernDesc; for (i=0;i<4096;i+=sizeof(struct memDescriptor)) { tmpDesc->page = 0x0; @@ -65,7 +66,7 @@ } if (findDesc->next == 0) { break; } } - tmpDesc = (void *)getFreePage(); + tmpDesc = (void *)getFreePage(_current->id); findDesc->next = tmpDesc; for (i=0;i<4096;i+=sizeof(struct memDescriptor)) { tmpDesc->page = 0x0; @@ -102,7 +103,7 @@ break; } if (tmpDesc->page == 0x0) { - tmpDesc->page = (void *)getFreePage(); + tmpDesc->page = (void *)getFreePage(_current->id); tmpDesc->base = tmpDesc->page; tmpDesc->limit = len; tmpDesc->counter = 1; diff --git a/src/sys/kernel/syscall.c b/src/sys/kernel/syscall.c index 221dbe9..8da252a 100755 --- a/src/sys/kernel/syscall.c +++ b/src/sys/kernel/syscall.c @@ -54,7 +54,8 @@ int size; int fd; asm("": "=b" (ptr),"=c" (size),"=d" (fd)); - if (fd == 0) { + //Temp Hack + if (fd >= 0) { for (i=0;iid); + freeProcessPages(_current->id); _current->status = EMPTY; schedule(); } @@ -100,6 +101,7 @@ } //If We Dont Find the File Return if (!tmpFd) { + kprintf("Coulnt Find The File"); return; } //Now We Must Allocate Memory To Load The Binary Into diff --git a/src/sys/vmm/memory.c b/src/sys/vmm/memory.c index 84cedc9..46c4724 100755 --- a/src/sys/vmm/memory.c +++ b/src/sys/vmm/memory.c @@ -118,6 +118,7 @@ //Initialize All Free Pages To Available memoryMap[(0x100000/0x1000)].status = memAvail; for (i=memStart;iid),((x*(1024*4096))+(y*4096))); + remapPage(findFreePage(pid),((x*(1024*4096))+(y*4096))); //Return The Address Of The Newly Allocate Page return((void *)((x*(1024*4096))+(y*4096))); } @@ -490,6 +509,10 @@ pageTable = (uLong *)(tablesBaseAddress + (4096 * destPageDirectoryIndex)); //Get The Index To The Page Table destPageTableIndex = ((dest-(destPageDirectoryIndex*(1024*4096)))/4096); + //If The Page Is Mapped In Free It Before We Remap + if (pageTable[destPageTableIndex] > 0) { + freePage(((uLong)pageTable[destPageTableIndex] & 0xFFFFF000)); + } //Set The Source Address In The Destination pageTable[destPageTableIndex] = (uLong)(source | pageDefault); //Reload The Page Table; @@ -540,7 +563,7 @@ //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(); + dst = (uLong *) getFreePage(-1); //Copy Memory for (i=0;i