diff --git a/src/sys/kernel/fork.c b/src/sys/kernel/fork.c index bb6aa5f..fe29a37 100755 --- a/src/sys/kernel/fork.c +++ b/src/sys/kernel/fork.c @@ -31,26 +31,29 @@ pid_t fork() { int i=0,x=0; uChar *src,*dst; - uLong *pageDir,*pageTable; + uLong *pageDirsrc,*pageTablesrc,*pageDirdst,*pageTabledst; pid_t cPid = findTask(); //Find An Empty Task - schedule(); - pageDir = (uLong *)_current->tss.cr3; - disableIrq(0); + //schedule(); + pageDirsrc = (uLong *)_current->tss.cr3; + pageTabledst = (uLong *)allocPage(); for (i=0;i<1024;i++) { - if (pageDir[i] > 0) { - pageTable = (uLong *)(pageDir[i] & 0xFFFFF000); - kprintf("[%i][%i][%i]",i,pageTable,&pageTable); + if (pageDirsrc[i] > 0) { + pageTablesrc = (uLong *)(pageDirsrc[i] & 0xFFFFF000); + pageDirdst[i] = allocPage() | pageDefault; + pageTabledst = (uLong *)(pageDirdst[i] & 0xFFFFF000); for (x=0;x<1024;x++) { - kprintf("(%i)",pageTable[x]); - if ((pageTable[x] > 0) && ((pageTable[x] & 0xFFFFF000) != 0xA000)) { - pageTable[x] = (pageTable[x] & 0xFFFFFFFD); - //kprintf("[%i]\n",pageTable[x]); + if (pageTablesrc[x] > 0) { + pageTabledst[x] = pageTablesrc[x] & 0xFFFFFFD; + } + else { + pageTabledst[x] = 0x0; } } } + else { + pageDirdst[i] = 0x0; + } } - //enableIrq(0); - while(1); kprintf("Pid: [%i]\n",cPid); src = _current; dst = &taskList[cPid]; @@ -58,6 +61,8 @@ dst[i] = src[i]; } taskList[cPid].id = cPid; + taskList[cPid].tss.cr3 = pageDirdst; + //taskList[cPid].status = AVAILABLE; kprintf("[%i][%i]\n",_current->status,taskList[cPid].status); if (_current->id == cPid) { return(0);