Advertisement
Guest User

Untitled

a guest
Apr 25th, 2015
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.48 KB | None | 0 0
  1. void vmsim_handler(int signum , siginfo_t * info, void *context){
  2.  
  3. w_ptr_t addr, map_addr;
  4. int rc, page_nr, i, page_size = w_get_page_size();
  5. page_table_t *page_table;
  6. struct page_table_entry *virt_page;
  7. w_prot_t prot_RW;
  8. int frame_index, fd, len = page_size * sizeof(char);
  9. off_t pos; ssize_t written;
  10. char buf[page_size];
  11. enum page_state state;
  12. memset(buf, 0, page_size);
  13.  
  14. /* obtain from siginfo_t the memory location
  15. which caused the page fault */
  16. addr = info->si_addr;
  17.  
  18. /* check if the signal is SIGSEGV */
  19. if(signum != SIGSEGV){
  20. return;
  21. }
  22.  
  23. /* compute the page number which caused the page fault */
  24. page_table = find_between(&memmap, addr);
  25. DIE(page_table == NULL, "find_between");
  26.  
  27. page_nr = (int)(addr - page_table->vms->start)/ page_size;
  28. virt_page = &(page_table->virtual_pages[page_nr]);
  29. DIE(virt_page == NULL, "virt_page");
  30.  
  31. state = virt_page->state;
  32.  
  33. prot_RW = ((state == STATE_NOT_ALLOC) ? PROTECTION_READ :
  34. PROTECTION_WRITE);
  35.  
  36. if((state == STATE_NOT_ALLOC) || (state == STATE_IN_SWAP)){
  37.  
  38. virt_page->prev_state = state;
  39. virt_page->state = STATE_IN_RAM;
  40.  
  41. /* get frame number*/
  42. frame_index = get_frame_mapping(page_table);
  43.  
  44. /* if no available frame,then swap out */
  45. if(frame_index == -1)
  46. frame_index = swap_out(page_table);
  47.  
  48. virt_page->frame = malloc(sizeof(struct frame));
  49. virt_page->frame->index = frame_index;
  50. virt_page->frame->pte = virt_page;
  51. virt_page->protection = PROTECTION_READ;
  52.  
  53. /* map page to ram */
  54. rc = munmap(virt_page->start, page_size);
  55. DIE(rc == -1, "munmap");
  56.  
  57. map_addr = mmap(virt_page->start, page_size, prot_RW,
  58. MAP_FIXED | MAP_SHARED, page_table->vms->ram_handle,
  59. frame_index * page_size);
  60. DIE(map_addr != virt_page->start, "NUUU");
  61.  
  62. if(state == STATE_NOT_ALLOC){
  63. /* fill ram memory with 0'z*/
  64. w_set_file_pointer(page_table->vms->ram_handle,
  65. frame_index * page_size);
  66. w_write_file(page_table->vms->ram_handle, buf, page_size);
  67.  
  68. }
  69. else {
  70. /* copy from swap to ram */
  71. memcpy(virt_page->start, page_table->vms->sstart +
  72. page_nr * page_size, page_size);
  73.  
  74. }
  75.  
  76. w_protect_mapping(virt_page->start, 1, virt_page->protection);
  77. }
  78. else
  79. //if(virt_page->state == STATE_IN_RAM &&
  80. if(virt_page->protection == PROTECTION_READ){
  81.  
  82. virt_page->protection = PROTECTION_WRITE;
  83. w_protect_mapping(virt_page->start, 1, PROTECTION_READ | PROTECTION_WRITE);
  84. virt_page->dirty = TRUE;
  85.  
  86. }
  87.  
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement