void page_fault_helper(struct page_table *pt, int page, int vPage, int vFrame, int flag) { int vFlag; /* get the victim flag */ page_table_get_entry(pt, vPage, &vFrame, &vFlag); /* check for RW flag */ int rw = (PROT_READ|PROT_WRITE); if(vFlag == rw) { /* write victim from physmem to disk */ disk_write(disk, vPage, &physmem[vFrame*PAGE_SIZE]); write_count++; } /* read from disk to victim frame */ disk_read(disk, page, &physmem[vFrame*PAGE_SIZE]); read_count++; /* update page table entries */ page_table_set_entry(pt, page, vFrame, flag); page_table_set_entry(pt, vPage, 0, 0); /* update loaded_pages */ loaded_pages[vFrame] = page; /* Second-Chance clock setting */ if(pageswap == 2 && flag == PROT_READ) { clock[vFrame] = 0; } }
void page_fault_handler( struct page_table *pt, int page ) { printf("page_rep_choice=%i\n",page_rep_choice); int frame,nframes,npages,retframe,bits; // get max number of pages and frames nframes = page_table_get_nframes(pt); npages = page_table_get_npages(pt); // check if frame number should be page number if (nframes>=npages){ printf("page fault on page #%d\n",page); frame = page; } // FIFO else if (nframes<npages){ printf("page fault on page #%d\n",page); if (page_rep_choice==0){ // RAND frame = page; } else if (page_rep_choice==1){ // FIFO frame = page % nframes; } else if (page_rep_choice==2){ // CUSTOM frame = page; } } // check permissions // - no permissions -> read // - read permissions -> write // - write permissions -> all if (bits==0){ page_table_set_entry(pt,page,frame,PROT_READ); } else if(bits==1){ page_table_set_entry(pt,page,frame,PROT_WRITE); } else{ page_table_set_entry(pt,page,frame,PROT_READ|PROT_WRITE|PROT_EXEC); } page_table_get_entry(pt,page,&retframe,&bits); printf("frame=%i\tbits=%i\n",retframe,bits); // exit(1); }
void page_fault_handler( struct page_table *pt, int page ) { page_faults++; //printf("page fault on page #%d\n", page); int frame, bits; page_table_get_entry(pt, page, &frame, &bits); if(has_read(bits)) { //printf("page #%d was written to\n", page); page_table_set_entry(pt, page, frame, bits|PROT_WRITE); // DEBUG // page_table_print(pt); // sleep(1); return; } int unused_frame = next_unused_frame(pt); if (unused_frame != NO_UNUSED_FRAMES) { //printf("frame #%d is unused\n", unused_frame); swap_page(pt, page, unused_frame); } else { page_algo_handler(pt, page); } // DEBUG // page_table_print(pt); // sleep(1); }
void swap_page(struct page_table *pt, int in_page, int frame) { if (ft[frame] != -1) { int bits, out_page = ft[frame]; page_table_get_entry(pt, out_page, &frame, &bits); if(has_write(bits)) { // Memory has been modified - write to disk disk_write(disk, out_page, &physmem[frame * PAGE_SIZE]); disk_writes++; } page_table_set_entry(pt, out_page, 0, 0); //printf("swapping frame #%d of page #%d with page #%d\n", frame, out_page, in_page); } disk_read(disk, in_page, &physmem[frame * PAGE_SIZE]); page_table_set_entry(pt, in_page, frame, PROT_READ); disk_reads++; // Update frame table ft[frame] = in_page; }
void page_fault_handler( struct page_table *pt, int page ) { fault_counter++; int flag; int frame; /* get frame and flag for the page */ page_table_get_entry(pt, page, &frame, &flag); //page_table_print_entry(pt,page); int i; switch(flag) { case 0: /* check for free frame*/ for(i = 0; i < nframes; i++) { if(loaded_pages[i] == -1) { /* read from disk to physmem */ page_table_set_entry(pt, page, i, PROT_READ); disk_read(disk, page, &physmem[i*PAGE_SIZE]); loaded_pages[i] = page; read_count++; //page_table_print_entry(pt,page); //printf("\n"); return; } } /* variables for victim */ int vFrame, vPage; /* get the victim frame */ get_swap_frame(&vFrame); /* set the victim page */ vPage = loaded_pages[vFrame]; /* call the helper to settle the pages */ page_fault_helper(pt, page, vPage, vFrame, PROT_READ); //print_second_chance(); //page_table_print_entry(pt,page); //printf("\n"); return; case PROT_READ: page_table_set_entry(pt, page, frame, PROT_READ|PROT_WRITE); //page_table_print_entry(pt,page); //printf("\n"); if(pageswap == 2) { clock[frame] = 1; } if(pageswap == 3) { clock[frame] = 0; } return; } printf("page fault on page #%d\n",page); exit(1); }