Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Loader Implementation
- *
- * 2018, Operating Systems
- */
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <signal.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include "exec_parser.h"
- static so_exec_t *exec;
- static struct sigaction old_action;
- static int pageSize;
- int fd;
- static void segv_handler(int signum, siginfo_t *info, void *context)
- {
- uintptr_t *addr;
- int rc;
- int i;
- char* p;
- ssize_t bytes_read;
- if (signum != SIGSEGV && info->si_code == SEG_ACCERR) {
- old_action.sa_sigaction(signum, info, context);
- return;
- }
- addr = (uintptr_t *)info->si_addr;
- for( i=0; i<exec->segments_no; i++){
- //pagina mapata
- if(addr>exec->segments[i].vaddr && addr<exec->segments[i].vaddr+exec->segments[i].mem_size){
- int page = ( addr - exec->segments[i].vaddr ) / getpagesize();
- if( page * pageSize < exec->segments[i].file_size && (page+1)*pageSize > exec->segments[i].file_size) {
- p = mmap(page*pageSize,pageSize, PROT_WRITE, MAP_SHARED | MAP_PRIVATE | MAP_FIXED, fd, exec->segments[i].offset);
- rc = lseek(fd, exec->segments[i].offset, SEEK_SET);
- DIE(rc < 0, "lseek");
- bytes_read = read(fd, page*pageSize, exec->segments[i].mem_size-pageSize*page);
- DIE(bytes_read < 0, "read");
- p = mprotect(page*pageSize, (page+1)*pageSize - exec->segments[i].mem_size, exec->segments[i].perm);
- //mapezi cu doar perm de write
- // lseek cu offset(il ai in struct).
- // read din fisier prima bucata si scrii la inceputul paginii problema(doar pana la problema)
- // mprot(cu permisiunea din struct) pe a doua bucata
- }
- else if( page*pageSize < exec->segments[i].file_size ){
- p = mmap(page*pageSize,pageSize, exec->segments[i].perm, MAP_SHARED | MAP_PRIVATE | MAP_FIXED, fd, exec->segments[i].offset);
- DIE(p == (char *)-1, "mmap");
- // start=inceputul paginii problema
- // length = pagesize
- // prot= permisiuni, vezi structura seg
- // flags= map shared, private, fixed
- // fd
- //offset= vezzi struct seg
- }
- else{
- // ca in primul caz, dar pui 0,0 la final
- p = mmap(page*pageSize,pageSize, exec->segments[i].perm, MAP_SHARED | MAP_PRIVATE | MAP_FIXED, 0, 0);
- DIE(p == (char *)-1, "else mmap");
- }
- }
- }
- int page = (addr - exec->segments[i].vaddr) / getpagesize();
- }
- int so_init_loader(void)
- {
- /* TODO: initialize on-demand loader */
- struct sigaction action;
- int rc;
- pageSize = getpagesize();
- action.sa_sigaction = segv_handler;
- sigemptyset(&action.sa_mask);
- sigaddset(&action.sa_mask, SIGSEGV);
- action.sa_flags = SA_SIGINFO;
- rc = sigaction(SIGSEGV, &action, &old_action);
- DIE(rc == -1, "sigaction");
- return 0;
- }
- int so_execute(char *path, char *argv[])
- {
- //deschizi fisier, salvezi fd, folosesti fd in mmap
- exec = so_parse_exec(path);
- if (!exec)
- return -1;
- fd=open(path,O_RDONLY,0644);
- so_start_exec(exec, auintptr_trgv);
- return -1;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement