Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void vmsim_handler(int signum , siginfo_t * info, void *context){
- w_ptr_t addr, map_addr;
- int rc, page_nr, i, page_size = w_get_page_size();
- page_table_t *page_table;
- struct page_table_entry *virt_page;
- w_prot_t prot_RW;
- int frame_index, fd, len = page_size * sizeof(char);
- off_t pos; ssize_t written;
- char buf[page_size];
- enum page_state state;
- memset(buf, 0, page_size);
- /* obtain from siginfo_t the memory location
- which caused the page fault */
- addr = info->si_addr;
- /* check if the signal is SIGSEGV */
- if(signum != SIGSEGV){
- return;
- }
- /* compute the page number which caused the page fault */
- page_table = find_between(&memmap, addr);
- DIE(page_table == NULL, "find_between");
- page_nr = (int)(addr - page_table->vms->start)/ page_size;
- virt_page = &(page_table->virtual_pages[page_nr]);
- DIE(virt_page == NULL, "virt_page");
- state = virt_page->state;
- prot_RW = ((state == STATE_NOT_ALLOC) ? PROTECTION_READ :
- PROTECTION_WRITE);
- if((state == STATE_NOT_ALLOC) || (state == STATE_IN_SWAP)){
- virt_page->prev_state = state;
- virt_page->state = STATE_IN_RAM;
- /* get frame number*/
- frame_index = get_frame_mapping(page_table);
- /* if no available frame,then swap out */
- if(frame_index == -1)
- frame_index = swap_out(page_table);
- virt_page->frame = malloc(sizeof(struct frame));
- virt_page->frame->index = frame_index;
- virt_page->frame->pte = virt_page;
- virt_page->protection = PROTECTION_READ;
- /* map page to ram */
- rc = munmap(virt_page->start, page_size);
- DIE(rc == -1, "munmap");
- map_addr = mmap(virt_page->start, page_size, prot_RW,
- MAP_FIXED | MAP_SHARED, page_table->vms->ram_handle,
- frame_index * page_size);
- DIE(map_addr != virt_page->start, "NUUU");
- if(state == STATE_NOT_ALLOC){
- /* fill ram memory with 0'z*/
- w_set_file_pointer(page_table->vms->ram_handle,
- frame_index * page_size);
- w_write_file(page_table->vms->ram_handle, buf, page_size);
- }
- else {
- /* copy from swap to ram */
- memcpy(virt_page->start, page_table->vms->sstart +
- page_nr * page_size, page_size);
- }
- w_protect_mapping(virt_page->start, 1, virt_page->protection);
- }
- else
- //if(virt_page->state == STATE_IN_RAM &&
- if(virt_page->protection == PROTECTION_READ){
- virt_page->protection = PROTECTION_WRITE;
- w_protect_mapping(virt_page->start, 1, PROTECTION_READ | PROTECTION_WRITE);
- virt_page->dirty = TRUE;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement