38,8 → 38,10 |
#include <unistd.h> |
#include <fcntl.h> |
#include <sys/types.h> |
#include <as.h> |
|
#include "elf.h" |
#include "pcb.h" |
|
unsigned int elf_load(int fd, elf_header_t *header); |
|
76,9 → 78,26 |
/* not reached */ |
} |
|
void elf_create_pcb(elf_header_t *header) |
{ |
pcb_t *pcb; |
void *a; |
|
pcb = (pcb_t *)PCB_ADDRESS; |
|
a = as_area_create(pcb, sizeof(pcb_t), AS_AREA_READ | AS_AREA_WRITE); |
if (a == (void *)(-1)) { |
printf("elf_create_pcb: memory mapping failed\n"); |
return EE_MEMORY; |
} |
|
pcb->entry = (entry_point_t)header->e_entry; |
} |
|
int main(int argc, char *argv[]) |
{ |
elf_header_t header; |
elf_header_t prog_header; |
elf_header_t interp_header; |
char *file_name; |
int rc; |
|
85,18 → 104,29 |
printf("This is loader\n"); |
getchar(); |
|
file_name = "/test"; |
rc = elf_load_file(file_name, &header); |
printf("open and read '%s'...\n", file_name); |
printf("Load program\n"); |
|
rc = elf_load_file("/tetris", &prog_header); |
if (rc < 0) { |
printf("failed to load program\n"); |
return 1; |
} |
|
printf("run program\n"); |
elf_run(&header); |
printf("Create PCB\n"); |
elf_create_pcb(&prog_header); |
|
printf("Load dynamic linker\n"); |
file_name = "/rtld.so"; |
printf("open and read '%s'...\n", file_name); |
rc = elf_load_file(file_name, &interp_header); |
if (rc < 0) { |
printf("failed to load dynamic linker\n"); |
return 1; |
} |
|
printf("run dynamic linker\n"); |
elf_run(&interp_header); |
|
/* not reached */ |
return 0; |
} |