示例#1
0
文件: mmanage.c 项目: Slaan/bs3
void 
allocate_page(void)
{
    int req_pageno        = vmem->adm.req_pageno;
    int frame             = VOID_IDX;
    int page_removed_idx  = VOID_IDX;
    if(vmem->pt.entries[req_pageno].flags & PTF_PRESENT)
            
    {
      // no page fault!
      return;
    } 
    /* find free page */
    frame = search_bitmap();
#ifdef DEBUG_MESSAGES
    printf("bitmap: frame %d\n", frame);
#endif // DEBUG_MESSAGES
    if(frame != VOID_IDX) 
    {
      fprintf(stderr, "Found free frame no %d, allocation page\n", frame);
      update_pt(frame);
      fetch_page(vmem->adm.req_pageno);
    } else {
      frame = find_remove_frame();
    }
    /* TODO: impl stuff*/
    page_removed_idx = vmem->pt.framepage[frame];
    /* TODO: impl stuff*/
    /* Store page to be removed and clear present-bit */
    if(vmem->pt.entries[page_removed_idx].flags & PTF_DIRTY) {
      store_page(page_removed_idx);
    }
    vmem->pt.entries[page_removed_idx].flags &= ~PTF_PRESENT;
    /* Load new page */
    update_pt(frame);
    fetch_page(vmem->adm.req_pageno);
    /* Update page fault counter */
    vmem->adm.pf_count++;
    // log allocation
    struct logevent le;
    le.req_pageno     = vmem->adm.req_pageno;
    le.replaced_page  = page_removed_idx;
    le.alloc_frame    = frame;
    le.pf_count       = vmem->adm.pf_count;
    le.g_count        = vmem->adm.g_count;
    logger(le);
    // unblock application
    sem_post(&(vmem->adm.sema));
}
示例#2
0
static int toss_page()
{
	int page;
	int frame;
	
	page = get_removal_page();
	if (!pg_table[page].valid) {
		fprintf(stderr, "toss_page: tossing invalid page\n");
		return -1;
	}
	if (page < 0) {
		fprintf(stderr, "toss_page: all valid pages in use. Increase page size or physical memory.\n");
		return -1;
	}
	store_page(page);
	pg_table[page].valid = 0;
	frame = pg_table[page].frame_addr / sys_pager.pg_size;
	free_frames[frame] = 1;
	return 0;
}
示例#3
0
void update_pt(int frame) {
	int mBit; //mod bit
	int pagenumb = vmem->adm.req_pageno;
	// alte Seite aus dem Frame löschen
	int oldPage = vmem->pt.framepage[frame];
	event.replaced_page=oldPage;
	if(oldPage != VOID_IDX){
		vmem->pt.entries[oldPage].frame = VOID_IDX;
	}
	// die Seite in File schreiben, wenn notwendig
	mBit = vmem->pt.entries[oldPage].flags & PTF_DIRTY;
	if (oldPage != VOID_IDX && mBit == PTF_DIRTY) {
		store_page(oldPage);
		vmem->pt.entries[oldPage].flags -= PTF_DIRTY;
	}
	//neue Seite laden
	fetch_page(pagenumb);
	vmem->pt.entries[pagenumb].frame = frame;
	vmem->pt.entries[pagenumb].age=DEF_AGE;
	vmem->pt.framepage[frame] = pagenumb;
}
示例#4
0
void page_fault() {
    int page_unloaded = VOID_IDX;
    int new_frame = VOID_IDX;
    int req_page = vmem->adm.req_pageno;
    
    // Page fault aufgetreten
    DEBUG(fprintf(stderr, "Pagefault: Requested Page: %d\n", req_page));
    
    vmem->adm.pf_count++;
    
    new_frame = find_remove_frame();
    
    page_unloaded = vmem->pt.framepage[new_frame];
    
    if( vmem_is_full() ) {
	store_page(page_unloaded);
    }
    update_pt(new_frame);
    
    fetch_page(req_page);
    
    
    // make Logs
    struct logevent le;
    le.req_pageno = vmem->adm.req_pageno;
    le.replaced_page = page_unloaded;
    le.alloc_frame = new_frame;
    le.pf_count = vmem->adm.pf_count;
    le.g_count = vmem->adm.pf_count;
    logger(le);
    
    DEBUG(fprintf(stderr, "Page loaded. pf_count=%d\n", vmem->adm.pf_count));
    
    // Den aufrufenden Freigeben
    sem_post(&vmem->adm.sema);
}