Skip to content
Snippets Groups Projects
Commit faf87f7a authored by Videau Luc's avatar Videau Luc
Browse files

add file after mappage

parent fc0ece50
No related branches found
Tags tp2-act-7-3
No related merge requests found
......@@ -77,7 +77,7 @@ exec(char *path, char **argv)
}
struct vma* vma = add_memory_area(p, PGROUNDUP(ph.vaddr), PGROUNDUP(ph.vaddr + ph.memsz));
vma->vma_flags = VMA_R | VMA_W | VMA_X;
vma->file = path;
vma->file = strdup(path);
vma->file_offset = ph.off;
vma->file_nbytes = ph.filesz;
}
......
......@@ -411,6 +411,24 @@ int do_allocate(pagetable_t pagetable, struct proc* p, uint64 addr, uint64 scaus
kfree((void*)pa);
return EMAPFAILED;
}
if (mem_area->file) {
uint64 file_start_offset = PGROUNDDOWN(addr - mem_area->va_begin) + mem_area->file_offset;
if (file_start_offset > mem_area->file_offset + mem_area->file_nbytes){
return 0;
}
uint64 nbytes = mem_area->file_nbytes - PGROUNDDOWN(addr - mem_area->va_begin) > PGSIZE ? PGSIZE : mem_area->file_nbytes - PGROUNDDOWN(addr - mem_area->va_begin);
release(&p->vma_lock);
int res = load_from_file(mem_area->file, file_start_offset, pa, nbytes);
acquire(&p->vma_lock);
if (res != 0){
kfree((char*) pa);
return ENOFILE;
}
}
// Le seul moment où les VMAs peuvent être modifiées (i.e. supprimées) sont
// dans freeproc, qui lui même n'est appelé que dans wait() d'un parent du
// processus courant, seulement si nous sommes dans l'état ZOMBIE. (ce qui
// n'est pas le cas)
return 0;
}
if ((PTE_FLAGS(*ad) & PTE_U) == 0)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment