示例#1
0
/*
 Code Reference :  My Previous Submission
 */
void map_exe(struct mm_struct * mm_struct)
{
    //  printk("\n Map Exe");
    //  while(1);
    // printk("\nStart Address %x",exeFormat.entryAddr);
    uint64_t entryAddress = (uint64_t) exeFormat.entryAddr;
    mm_struct->entryAddress = entryAddress;
    int i = 0;
    for (; i < exeFormat.numSegments; i++)
    {
        struct Exe_Segment segment =
                (struct Exe_Segment) exeFormat.segmentList[i];
        uint64_t start = segment.vaddr;
        uint64_t end = segment.vaddr + segment.sizeInMemory;
        uint64_t pageNeeded = 0;
        uint64_t least_start = 0;
        uint64_t max_end = 0;
        if (end - start != 0)
        {
            least_start = (start / 0x1000) * 0x1000;
            max_end = (end / 0x1000) * 0x1000 + 0x1000;
            //   printk("\n least_start : %x",least_start);
            // printk("\n max_end : %x",max_end);
            pageNeeded = (max_end - least_start) / 0x1000;
            //printk("\nPage Needed :%x",pageNeeded);
        }
        if (pageNeeded != 0)
        {
            struct vm_area_struct* vm_area =
                    (struct vm_area_struct *) virtual_alloc();
            vm_area->vm_start = least_start;
            vm_area->vm_end = max_end;
            mm_struct->current->vm_next = vm_area;
            mm_struct->current = vm_area;
            mm_struct->current->vm_next = NULL;
            while (pageNeeded != 0)
            {
                void *physicalAddress = page_alloc();
                //  printk("\n Physical Address :%x",physicalAddress);
                map_process(least_start, (uint64_t) physicalAddress);

                pageNeeded -= 1;
                least_start += 0x1000;
            }
            uint64_t ondiskstart = segment.offsetInFile + elf_start;
            uint64_t size = segment.sizeInMemory;
            char *ondisk = (char *) ondiskstart;
            char *vadd = (char *) start;
            //        printk("\n Copying ... ");
            while (size)
            {
                *vadd = *ondisk;
                vadd++;
                ondisk++;
                size--;
            }
        }
    }
}
示例#2
0
/*
 Code Reference :  My Previous Submission
 */
uint64_t map_temp()
{
    uint64_t entryAddress = (uint64_t) exeFormat.entryAddr;
    //  mm_struct->entryAddress = entryAddress;
    int i = 0;
    for (; i < exeFormat.numSegments; i++)
    {
        struct Exe_Segment segment =
                (struct Exe_Segment) exeFormat.segmentList[i];
        uint64_t start = segment.vaddr;
        uint64_t end = segment.vaddr + segment.sizeInMemory;
        uint64_t pageNeeded = 0;
        uint64_t least_start = 0;
        uint64_t max_end = 0;
        if (end - start != 0)
        {
            least_start = (start / 0x1000) * 0x1000;
            max_end = (end / 0x1000) * 0x1000 + 0x1000;
            pageNeeded = (max_end - least_start) / 0x1000;
            // printk("\nPage Needed :%x",pageNeeded);
        }
        if (pageNeeded != 0)
        {
            while (pageNeeded != 0)
            {
                void *physicalAddress = page_alloc();
                //  printk("\n Physical Address :%x",physicalAddress);
                map_process(least_start, (uint64_t) physicalAddress);

                pageNeeded -= 1;
                least_start += 0x1000;
            }
            uint64_t ondiskstart = segment.offsetInFile + elf_start;
            //uint64_t ondiskfinish = segment.offsetInFile + elf_start + segment.sizeInMemory;
            //      printk("\n ondiskstart: %x odiskfinish: %x", ondiskstart,ondiskfinish);
            uint64_t size = segment.sizeInMemory;
            char *ondisk = (char *) ondiskstart;
            char *vadd = (char *) start;
            //      printk("\nvadd %x",vadd);
            while (size)
            {
                *vadd = *ondisk;
                vadd++;
                ondisk++;
                size--;
            }
            //      printk("\nvadd %x",vadd);
        }
    }
    return entryAddress;
}
示例#3
0
文件: elf.c 项目: GehlotGarima/SBUnix
int load_exe(task_struct *task, void *exe_start)
{
	mm_struct *mm = task->mm;

	/* ELF header */
	elfHeader *ehdr = (elfHeader *)exe_start;

	/* program header */
	progHeader *phdr = (progHeader *)((uint64_t)ehdr + ehdr->e_phoff);
	
	int count = 0;

	/* new task entry point */
	task->rip = ehdr->e_entry;
	task->mm->mmap = NULL;

	for(; count < ehdr->e_phnum; count++) {

		/* loadable section */
		if(phdr->p_type == 1) {

			vma_struct *vma = (vma_struct *)kmalloc();

			if(mm->mmap == NULL) {
				mm->mmap = vma;
			} else {
				mm->current->next = vma;
				
			}
			mm->current = vma;
			vma->mm = mm;

 			vma->start = phdr->p_vaddr;
			vma->end = phdr->p_vaddr + phdr->p_memsz;

			/* copy the exe contents to the binary's virtual address */ 
			uint64_t size = (((vma->end/0x1000)*0x1000 + 0x1000)-((vma->start/0x1000)*0x1000));
			uint64_t itr = size/0x1000;
			uint64_t start = (phdr->p_vaddr/0x1000)*0x1000;
			while(itr) {
				uint64_t page = (uint64_t)allocate_page();
				map_process(start, page);
				itr--;
				start += 0x1000; 
			}

			vma->flags = phdr->p_flags;
			vma->file = NULL;
			vma->next = NULL;
			vma->type = NOTYPE;

			if((phdr->p_flags == (PERM_R | PERM_X))
				|| (phdr->p_flags == (PERM_R | PERM_W))){

				task->mm->start_code = phdr->p_vaddr;
                                task->mm->end_code = phdr->p_vaddr + phdr->p_memsz;
				vma->file = (struct file *)kmalloc();  
				vma->file->start = (uint64_t)ehdr;
				vma->file->pgoff = phdr->p_offset;
				vma->file->size = phdr->p_filesz;	
				
				memcpy((void*)vma->start, (void*)((uint64_t)ehdr + phdr->p_offset), phdr->p_filesz);
				if(phdr->p_flags == (PERM_R | PERM_X)) {
					vma->file->bss_size = 0;
					vma->type = TEXT;
				} else {
					vma->file->bss_size = phdr->p_memsz - phdr->p_filesz;
					vma->type = DATA; 
				}	
			}

		}

		phdr++;
	}

	/* Allocate HEAP */ 
	vma_struct *vma_heap = (vma_struct *)kmalloc();
	if(mm->mmap == NULL)
		mm->mmap = vma_heap;		
	else
		mm->current->next = vma_heap;

	mm->current = vma_heap;
	vma_heap->mm = mm; 

//	if(!mm->end_data)
//		return 1;	


	vma_heap->start = HEAP_START;
	mm->brk = HEAP_START;
        vma_heap->end = HEAP_START + PAGE_SIZE;
        vma_heap->flags = (PERM_R | PERM_W);
        vma_heap->type = HEAP;
        vma_heap->file = NULL;
        vma_heap->next = NULL;
	get_phy_addr(HEAP_START);

	/* Allocate STACK */
	vma_struct *vma_stack = (vma_struct *)kmalloc();

	if(mm->mmap == NULL) {
		mm->mmap = vma_stack;
        } else {
        	mm->current->next = vma_stack;
        }
        mm->current = vma_stack;	

	uint64_t *stack = (uint64_t *)get_phy_addr(USER_STACK_TOP);	
	vma_stack->start = (uint64_t)stack + PAGE_SIZE; 
	vma_stack->end = (uint64_t)stack;
	vma_stack->flags = (PERM_R | PERM_W);
	vma_stack->type = STACK;
	vma_stack->file = NULL;
	vma_stack->next = NULL;

	task->rsp = (uint64_t)((uint64_t)stack + 4096 - 16);

	return 0;	
}