コード例 #1
0
ファイル: pt.c プロジェクト: billxinli/cs350
void pt_page_in(vaddr_t vaddr, struct segment *s) {
    int spl = splhigh();
    _vmstats_inc(VMSTAT_TLB_FAULT);
    
    //get the page detail
    int pt_offset_id = (vaddr - s->vbase) / PAGE_SIZE;
    struct page_detail *pd = &(s->pt->page_details[pt_offset_id]);
    
    if (pd->valid && pd->pfn != -1){
        pd->use = 1;
        _vmstats_inc(VMSTAT_TLB_RELOAD);
        tlb_add_entry(vaddr, pd->pfn*PAGE_SIZE, s->writeable, 1); 
        splx(spl);
        return;
    }else if(pd->sfn != -1){
        splx(spl);
        pd->use = 1;
        pd->pfn = cm_getppage();
        swap_read(pd->pfn,pd->sfn);
        pd->sfn = -1;
        //add the tlb entry
        tlb_add_entry(vaddr, pd->pfn*PAGE_SIZE, s->writeable, 1);
        //finish the load
        cm_finish_paging(pd->pfn, pd);
    }else{
        splx(spl);
        pd->use = 1;
        pd->pfn = cm_getppage();
        load_segment_page(curthread->t_vmspace->file, vaddr, s, pd->pfn*PAGE_SIZE);
        //add the tlb entry
        tlb_add_entry(vaddr, pd->pfn*PAGE_SIZE, s->writeable, 1);
        //finish the load
        cm_finish_paging(pd->pfn, pd);
    }
}
コード例 #2
0
ファイル: fault_handler.c プロジェクト: HKervadec/tp4info
void page_fault_handler(page_virt pv){
	// Get a Free block
	if(pm_isFull()){
		printf("PF: Unload a page\n");
		unloadAPage(); // fill
	}
	page_phys pp = pm_getFreePage();

	// Mark page as loaded
	printf("PF: Load a page (%d)\n",pv);
	loadAPage(pv); // fill

	// Read from Swap
	if(page_table[pv].status == SWAPPED){
		swap_read(pv,pp);
	}

	// Update page table
	page_table[pv].pp=pp;
	page_table[pv].status=ALLOCATED;

	// Write to MMU
	mmu_addTranslation(pv,pp);

	// That's all
}
コード例 #3
0
ファイル: swap.c プロジェクト: taeguk/OS-pintos
bool swap_load (struct frame *frame)
{
  //printf ("[Debug] swap_load ()!\n");
  struct swap_slot *slot = swap_search (frame->suppage);
  if (slot == NULL)
    return false;

  swap_read (slot->sec_no_start, frame->kpage, PGSIZE);
  swap_remove (slot);

  //printf ("[Debug] success of swap_load ()!\n");
  return true;
}