コード例 #1
0
ファイル: main.c プロジェクト: Madx-com/BOSC
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;
	}
}
コード例 #2
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);
}
コード例 #3
0
ファイル: main.c プロジェクト: 0uverture/BOSC
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);
}
コード例 #4
0
ファイル: main.c プロジェクト: 0uverture/BOSC
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;
}
コード例 #5
0
ファイル: main.c プロジェクト: Madx-com/BOSC
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);
}