Advertisement
Guest User

Untitled

a guest
Apr 18th, 2019
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.92 KB | None | 0 0
  1. /*
  2. * Loader Implementation
  3. *
  4. * 2018, Operating Systems
  5. */
  6.  
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <stdlib.h>
  10. #include <signal.h>
  11. #include <fcntl.h>
  12. #include <unistd.h>
  13.  
  14. #include "exec_parser.h"
  15.  
  16. static so_exec_t *exec;
  17.  
  18. static struct sigaction old_action;
  19. static int pageSize;
  20. int fd;
  21. static void segv_handler(int signum, siginfo_t *info, void *context)
  22. {
  23. uintptr_t *addr;
  24. int rc;
  25. int i;
  26. char* p;
  27. ssize_t bytes_read;
  28.  
  29. if (signum != SIGSEGV && info->si_code == SEG_ACCERR) {
  30. old_action.sa_sigaction(signum, info, context);
  31. return;
  32. }
  33.  
  34. addr = (uintptr_t *)info->si_addr;
  35.  
  36. for( i=0; i<exec->segments_no; i++){
  37. //pagina mapata
  38. if(addr>exec->segments[i].vaddr && addr<exec->segments[i].vaddr+exec->segments[i].mem_size){
  39. int page = ( addr - exec->segments[i].vaddr ) / getpagesize();
  40. if( page * pageSize < exec->segments[i].file_size && (page+1)*pageSize > exec->segments[i].file_size) {
  41. p = mmap(page*pageSize,pageSize, PROT_WRITE, MAP_SHARED | MAP_PRIVATE | MAP_FIXED, fd, exec->segments[i].offset);
  42. rc = lseek(fd, exec->segments[i].offset, SEEK_SET);
  43. DIE(rc < 0, "lseek");
  44.  
  45. bytes_read = read(fd, page*pageSize, exec->segments[i].mem_size-pageSize*page);
  46. DIE(bytes_read < 0, "read");
  47.  
  48. p = mprotect(page*pageSize, (page+1)*pageSize - exec->segments[i].mem_size, exec->segments[i].perm);
  49. //mapezi cu doar perm de write
  50. // lseek cu offset(il ai in struct).
  51. // read din fisier prima bucata si scrii la inceputul paginii problema(doar pana la problema)
  52. // mprot(cu permisiunea din struct) pe a doua bucata
  53.  
  54. }
  55. else if( page*pageSize < exec->segments[i].file_size ){
  56. p = mmap(page*pageSize,pageSize, exec->segments[i].perm, MAP_SHARED | MAP_PRIVATE | MAP_FIXED, fd, exec->segments[i].offset);
  57. DIE(p == (char *)-1, "mmap");
  58. // start=inceputul paginii problema
  59. // length = pagesize
  60. // prot= permisiuni, vezi structura seg
  61. // flags= map shared, private, fixed
  62. // fd
  63. //offset= vezzi struct seg
  64. }
  65. else{
  66. // ca in primul caz, dar pui 0,0 la final
  67. p = mmap(page*pageSize,pageSize, exec->segments[i].perm, MAP_SHARED | MAP_PRIVATE | MAP_FIXED, 0, 0);
  68. DIE(p == (char *)-1, "else mmap");
  69. }
  70.  
  71. }
  72.  
  73. }
  74.  
  75.  
  76. int page = (addr - exec->segments[i].vaddr) / getpagesize();
  77.  
  78.  
  79. }
  80.  
  81. int so_init_loader(void)
  82. {
  83. /* TODO: initialize on-demand loader */
  84. struct sigaction action;
  85. int rc;
  86. pageSize = getpagesize();
  87.  
  88. action.sa_sigaction = segv_handler;
  89. sigemptyset(&action.sa_mask);
  90. sigaddset(&action.sa_mask, SIGSEGV);
  91. action.sa_flags = SA_SIGINFO;
  92.  
  93. rc = sigaction(SIGSEGV, &action, &old_action);
  94. DIE(rc == -1, "sigaction");
  95.  
  96. return 0;
  97. }
  98.  
  99. int so_execute(char *path, char *argv[])
  100. {
  101. //deschizi fisier, salvezi fd, folosesti fd in mmap
  102.  
  103. exec = so_parse_exec(path);
  104. if (!exec)
  105. return -1;
  106. fd=open(path,O_RDONLY,0644);
  107. so_start_exec(exec, auintptr_trgv);
  108.  
  109. return -1;
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement