int getClockFrame(int notme) { int frame; // iterate through rpts (0x2400 - LC3_RPT_END) int maxWrap = 20; for (;maxWrap; cBigHand += 2, cLittleHand = 0) { int i; int rpte1; int upta, upte1; if (cBigHand >= LC3_RPT_END) { DEBUG_STATEMENT(DEBUG_MMU,"\nClock is wrapping"); cBigHand = LC3_RPT; maxWrap--; } rpte1 = memory[cBigHand]; if (DEFINED(rpte1) && REFERENCED(rpte1)) { // clear reference DEBUG_STATEMENT(DEBUG_MMU,"\nclearing ref for rpte"); memory[cBigHand] = rpte1 = CLEAR_REF(rpte1); } else if (DEFINED(rpte1)) { // if one is non-referenced go to the user page table // scout out the upt!! note that this has not been referenced if (DEBUG_MMU) { outPTE("\nRPT entry being checked - ", cBigHand); } upta = (FRAME(rpte1)<<6); for (i = cLittleHand % 64; i < 64;i += 2, cLittleHand = i % 64) { // - iterate over userpage table upte1 = memory[upta + (i)]; if (PINNED(upte1) || FRAME(upte1) == notme) { DEBUG_STATEMENT(DEBUG_MMU,"\nupte1 frame was the notme frame (%x = %x) or pinned", FRAME(upte1), notme); if (DEBUG_MMU) { outPTE("UPT entry being checked - ", upta + i); } continue; } if (DEFINED(upte1) && REFERENCED(upte1)) { // - if entry is referenced un-reference and move on // clear reference DEBUG_STATEMENT(DEBUG_MMU,"\nclearing ref for upte %d", cLittleHand); memory[cBigHand] = rpte1 = SET_PINNED(rpte1); memory[upta + (i)] = upte1 = CLEAR_REF(upte1); } else if (DEFINED(upte1)) { // - otherwise prep it for being put into swap // we can use the frame referenced by upte1 if (DEBUG_MMU) { outPTE("UPT entry being checked - ", upta + 1); } DEBUG_STATEMENT(DEBUG_MMU,"\nUpte1 %x, Upte2 %x", upte1, memory[upta + (i + 1)]); memory[cBigHand] = rpte1 = SET_DIRTY(rpte1); frame = FRAME(upte1); swapOutFrame(upta + i); cLittleHand += 2; DEBUG_STATEMENT(DEBUG_MMU,"\nFound a data frame that can be used! (%d, %x)", frame, frame); return frame; } } cLittleHand = 0; if (!REFERENCED(rpte1) && !PINNED(rpte1) && FRAME(rpte1) != notme) { // if we only replaced or did nothing to upte entries // we can use the frame referenced by rpte1 frame = FRAME(rpte1); DEBUG_STATEMENT(DEBUG_MMU,"\nFound a upt frame that can be used! (%d, %x)", frame, frame); swapOutFrame(cBigHand); cBigHand += 2; return frame; } else { // otherwise remove the pin flag memory[cBigHand] = rpte1 = CLEAR_PINNED(rpte1); } } } // when you get the bottom start at the top again DEBUG_STATEMENT(DEBUG_MMU,"\n No valid frame found notme = %d", notme); if (DEBUG_MMU) { displayTableHierarchy(); } return -1; }
int clockRunner(int notme) { //extern int curRPT; //extern TCB tcb[MAX_TASKS]; int i,j,k; int rpta, rpte1, rpte2; int upta, upte1, upte2; int victimFrame; int tupta, tupte1; //printf("\nClock running...%d\n",clockCount++); //victimEntry = 0; while (1) { //rpta = tcb[curRPT].RPT; for (i = curRPTE; i < 0x3000; i+=2) { //rpte1 = memory[rpta + i]; //rpte2 = memory[rpta + i + 1]; rpte1 = memory[i]; rpte2 = memory[i + 1]; if (DEFINED(rpte1)) { if (curUPTE == 0) { if(PINNED(rpte1)) { //memory[rpta + i] = rpte1 = CLEAR_PINNED(rpte1); memory[i] = rpte1 = CLEAR_PINNED(rpte1); } } upta = (FRAME(rpte1)<<6); for (j = curUPTE; j < 64; j+=2) { upte1 = memory[upta + j]; upte2 = memory[upta + j + 1]; if (DEFINED(upte1)) { //memory[rpta + i] = rpte1 = SET_PINNED(rpte1); memory[i] = rpte1 = SET_PINNED(rpte1); if (REFERENCED(upte1)) { memory[upta + j] = upte1 = CLEAR_REF(upte1); } else { //victimEntry = upte1; // if end of UPT, reset upte and move to next UPT //break; // because this is the victim // instead of break, do swapping and return victim frame number // immunity from notme //if (FRAME(upte1) != notme) //{ if (DIRTY(upte1)) { int page; //stat pageWrites++; if(PAGED(upte2)) { page = accessPage(SWAPPAGE(upte2),FRAME(upte1),PAGE_OLD_WRITE); } else { page = accessPage(0,FRAME(upte1),PAGE_NEW_WRITE); } upte2 = page; memory[upta + j + 1] = upte2 = SET_PAGED(upte2); } // save frame number before obliterating first word victimFrame = FRAME(upte1); //memory[upta + j] = upte1 = CLEAR_DEFINED(upte1); memory[upta + j] = upte1 = 0; curUPTE = (j + 2) % 64; //printf("\nChose a UPT victim: %d\n",victimFrame); return victimFrame; //} } } } // immunity from notme if ((FRAME(rpte1) != notme) && (!PINNED(rpte1))) { //victimEntry = rpte1; // if end of RPT, reset rpte and move to next RPT //break; // because this is the victim // instead of break, do swapping and return victim frame number //victimEntry = FRAME(rpte1); // sanity check tupta = (FRAME(rpte1)<<6); for (k = 0; k < 64; k+=2) { tupte1 = memory[tupta + k]; if (DEFINED(tupte1)) printf("\nEvicting a UPT that has defined entries!!!\n"); } //if (DIRTY(rpte1)) { int page; //stat pageWrites++; if(PAGED(rpte2)) { page = accessPage(SWAPPAGE(rpte2),FRAME(rpte1),PAGE_OLD_WRITE); } else { page = accessPage(0,FRAME(rpte1),PAGE_NEW_WRITE); } rpte2 = page; //memory[rpta + i + 1] = rpte2 = SET_PAGED(rpte2); memory[i + 1] = rpte2 = SET_PAGED(rpte2); } // save frame number before obliterating first word victimFrame = FRAME(rpte1); //memory[rpta + i] = rpte1 = CLEAR_DEFINED(rpte1); //memory[rpta + i] = rpte1 = 0; memory[i] = rpte1 = 0; //curRPTE = (i + 2) % 64; //printf("\nChose a RPT victim: %d\n",victimFrame); return victimFrame; } curUPTE = 0; } } //curRPT = (curRPT + 1) % MAX_TASKS; curRPTE = 0x2400; } }
int getFrame(int notme) { int UPTClock; // clock for UPT int frame; frame = getAvailableFrame(); if (frame >=0) return frame; if(RPTClock == 0){ RPTClock = LC3_RPT; } int RPTBegin = RPTClock; int first = 1; int rptCount = 0; //iterate the first time through the tables while(first || RPTClock != RPTBegin){ rptCount++; first = 0; //Check and make sure the notme condition holds if(DEFINED(memory[RPTClock])){ UPTClock = (FRAME(memory[RPTClock])<<6); int UPTBegin = UPTClock; int uFirst = 1; int hadDefined = 0; int uptcount = 0; while(uFirst || UPTClock != UPTBegin){ uptcount++; uFirst = 0; if(DEFINED(memory[UPTClock])){ hadDefined = 1; } if(notme != UPTClock && DEFINED(memory[UPTClock])){ //swap out if not referenced if(!REFERENCED(memory[UPTClock])){ //if it's dirty, write it to memory int swapPage = 0; if (DIRTY(memory[UPTClock])){ if(PAGED(memory[UPTClock + 1])) swapPage = accessPage(SWAPPAGE(memory[UPTClock + 1]), FRAME(memory[UPTClock]), PAGE_OLD_WRITE); else swapPage = accessPage(0, FRAME(memory[UPTClock]), PAGE_NEW_WRITE); memory[UPTClock] = CLEAR_DIRTY(memory[UPTClock]); memory[UPTClock+1] = SET_PAGED(swapPage); pageWrites++; } //no longer in main memory--it's swapped! memory[UPTClock] = CLEAR_DEFINED(memory[UPTClock]); //increment the clock if(RPTClock + 2 < LC3_RPT_END) RPTClock += 2; else RPTClock = LC3_RPT; return FRAME(memory[UPTClock]); } memory[UPTClock] = CLEAR_REF(memory[UPTClock]); } //sanity check assert(UPTClock >= 0x3000); if(UPTClock + 2 < UPTBegin + LC3_FRAME_SIZE) UPTClock += 2; else UPTClock = UPTBegin; } if(!REFERENCED(memory[RPTClock]) && !hadDefined && notme != RPTClock){ int swapPage; if(PAGED(memory[RPTClock + 1])) swapPage = accessPage(SWAPPAGE(memory[RPTClock + 1]), FRAME(memory[RPTClock]), PAGE_OLD_WRITE); else swapPage = accessPage(0, FRAME(memory[RPTClock]), PAGE_NEW_WRITE); memory[RPTClock] = CLEAR_DIRTY(memory[RPTClock]); memory[RPTClock+1] = SET_PAGED(swapPage); pageWrites++; memory[RPTClock] = CLEAR_DEFINED(memory[RPTClock]); int rE1 = memory[RPTClock]; if(RPTClock + 2 < LC3_RPT_END) RPTClock += 2; else RPTClock = LC3_RPT; return FRAME(rE1); } //clear the reference bit memory[RPTClock] = CLEAR_REF(memory[RPTClock]); } if(RPTClock + 2 < LC3_RPT_END){ RPTClock += 2; } else{ RPTClock = LC3_RPT; } } RPTBegin = RPTClock; first = 1; while(first || RPTClock != RPTBegin){ rptCount++; first = 0; //Check and make sure the notme condition holds if(DEFINED(memory[RPTClock])){ UPTClock = (FRAME(memory[RPTClock])<<6); int UPTBegin = UPTClock; int uFirst = 1; int hadDefined = 0; int uptcount = 0; while(uFirst || UPTClock != UPTBegin){ uptcount++; uFirst = 0; if(DEFINED(memory[UPTClock])){ hadDefined = 1; } if(notme != UPTClock && DEFINED(memory[UPTClock])){ //swap out if not referenced if(!REFERENCED(memory[UPTClock])){ //if it's dirty, write it to memory int swapPage = 0; if (DIRTY(memory[UPTClock])){ if(PAGED(memory[UPTClock + 1])) swapPage = accessPage(SWAPPAGE(memory[UPTClock + 1]), FRAME(memory[UPTClock]), PAGE_OLD_WRITE); else swapPage = accessPage(0, FRAME(memory[UPTClock]), PAGE_NEW_WRITE); memory[UPTClock] = CLEAR_DIRTY(memory[UPTClock]); memory[UPTClock+1] = SET_PAGED(swapPage); pageWrites++; } //no longer in main memory--it's swapped! memory[UPTClock] = CLEAR_DEFINED(memory[UPTClock]); //increment the clock if(RPTClock + 2 < LC3_RPT_END) RPTClock += 2; else RPTClock = LC3_RPT; return FRAME(memory[UPTClock]); } memory[UPTClock] = CLEAR_REF(memory[UPTClock]); } //sanity check assert(UPTClock >= 0x3000); if(UPTClock + 2 < UPTBegin + LC3_FRAME_SIZE) UPTClock += 2; else UPTClock = UPTBegin; } if(!REFERENCED(memory[RPTClock]) && !hadDefined && notme != RPTClock){ int swapPage; if(PAGED(memory[RPTClock + 1])) swapPage = accessPage(SWAPPAGE(memory[RPTClock + 1]), FRAME(memory[RPTClock]), PAGE_OLD_WRITE); else swapPage = accessPage(0, FRAME(memory[RPTClock]), PAGE_NEW_WRITE); memory[RPTClock] = CLEAR_DIRTY(memory[RPTClock]); memory[RPTClock+1] = SET_PAGED(swapPage); pageWrites++; memory[RPTClock] = CLEAR_DEFINED(memory[RPTClock]); int rE1 = memory[RPTClock]; if(RPTClock + 2 < LC3_RPT_END) RPTClock += 2; else RPTClock = LC3_RPT; return FRAME(rE1); } //clear the reference bit memory[RPTClock] = CLEAR_REF(memory[RPTClock]); } if(RPTClock + 2 < LC3_RPT_END){ RPTClock += 2; } else{ RPTClock = LC3_RPT; } } //we should never ever be here assert(0); return -1; }
int getFrame(int notme) { int frame; frame = getAvailableFrame(); if (frame >=0) return frame; // run clock int i, j, upta, frameToRemove; i = lastRpte; // i = 0x2400; // j = lastUpte; while(1){ // for(i=0x2400;i<0x3000;i+=2){ // printf("%x", i); if(DEFINED(memory[i])){ upta = FRAME(memory[i]); upta = (upta<<6); //double confirm int k; bool nothingInFrame = 1; for(k=upta;k<upta+64;k+=2){ if(DEFINED(memory[k])){ nothingInFrame = 0; break; } } if(nothingInFrame && FRAME(memory[i])!=notme){ frameToRemove = FRAME(memory[i]); lastRpte=i+2; memory[i] = CLEAR_DEFINED(memory[i]); memory[i] = CLEAR_REF(memory[i]); if(PAGED(memory[i+1]) && DIRTY(memory[i])){ memory[i+1] = accessPage(SWAPPAGE(memory[i+1]), frameToRemove, PAGE_OLD_WRITE); }else{ memory[i+1] = accessPage(0, frameToRemove, PAGE_NEW_WRITE); } memory[i+1] = SET_PAGED(memory[i+1]); memory[i] = SET_DIRTY(memory[i]); //possibly clear frame number return frameToRemove; // i can swap out this upt } // for(j=upta;j<upta+64;j+=2){ while(uptOffset < 64){ j = upta + uptOffset; if(DEFINED(memory[j])){ if(REFERENCED(memory[j])){ memory[j] = CLEAR_REF(memory[j]); }else{ //use this data frame frameToRemove = FRAME(memory[j]); lastRpte = i; memory[j] = CLEAR_DEFINED(memory[j]); memory[j] = CLEAR_REF(memory[j]); // memory[j] = SWAPPAGE(memory[j]); if(PAGED(memory[j+1]) && DIRTY(memory[j])){ memory[j+1] = accessPage(SWAPPAGE(memory[j+1]), frameToRemove, PAGE_OLD_WRITE); }else{ memory[j+1] = accessPage(0, frameToRemove, PAGE_NEW_WRITE); } memory[j+1] = SET_PAGED(memory[j+1]); uptOffset+=2; // may not need this line //need to loop through rest next time but if nothing dont remove this one return frameToRemove; } } uptOffset+=2; } uptOffset = 0; // } } i+=2; if(i==0x3000){ i=0x2400; } // } } // memory[(frameToRemove<<6)] return frame; }