int core_kickvictim(int *ret) { int victim = coremap_get_rr_victim(); int vpn = frame_to_vpn(victim); struct page_entry *pe; int result = get_page_entry_victim(&pe, victim); if(result) { return result; } //kprintf("%d %x\n", coremap_ptr[victim].pid, coremap_ptr[victim].id); swap_to_disk(vpn, pe); *ret = victim; return 0; }
void* frame_evict (void* uaddr) { /* 1. Choose a frame to evict, using your page replacement algorithm. The "accessed" and "dirty" bits in the page table, described below, will come in handy. */ struct frame_table_entry *fte = NULL; switch (PAGE_EVICTION_ALGORITHM) { /* First in first out */ case PAGE_EVICTION_FIFO: fte = frame_evict_choose_fifo (); break; /* Second chance */ case PAGE_EVICTION_SECONDCHANCE: fte = frame_evict_choose_secondchance (); break; default: PANIC ("Invalid eviction algorithm choice."); } ASSERT (fte != NULL); /* 2. Remove references to the frame from any page table that refers to it. Unless you have implemented sharing, only a single page should refer to a frame at any given time. */ pagedir_clear_page (fte->owner->pagedir, pg_round_down (fte->uaddr)); /* 3. If necessary, write the page to the file system or to swap. The evicted frame may then be used to store a different page. */ struct page *p_evict = page_lookup (fte->owner->pages, pg_round_down (fte->uaddr)); if (p_evict == NULL) PANIC ("Failed to get supp page for existing page."); /* Page to be evicted is in swap */ if (p_evict->page_location_option == FILESYS) { if (p_evict->writable) { file_write_at (p_evict->file, fte->kaddr, p_evict->page_read_bytes, p_evict->ofs); } } else if (p_evict->page_location_option == ALLZERO) { // All zero, so can just be overwritten } else { // From stack int index = swap_to_disk (pg_round_down (fte->uaddr)); /* Creates a supp page and insert it into pages. */ struct page *p = page_create (); if (p == NULL) PANIC ("Failed to get supp page for swap slot."); p->addr = fte->uaddr; p->page_location_option = SWAPSLOT; p->swap_index = index; page_insert (fte->owner->pages, &p->hash_elem); } /* Replace virtual address with new virtual address */ fte->owner = thread_current (); fte->uaddr = uaddr; /* Reinsert the frame table entry into the frame table */ lock_acquire (&frame_table_lock); list_remove (&fte->elem); list_push_front (&frame_table, &fte->elem); lock_release (&frame_table_lock); return fte->kaddr; }