Move elf loader into the init loader in the kernel
This commit is contained in:
parent
23895b5c6c
commit
eb454300e6
|
@ -7,7 +7,6 @@ add_executable(zion
|
||||||
interrupt/interrupt.cpp
|
interrupt/interrupt.cpp
|
||||||
interrupt/interrupt_enter.s
|
interrupt/interrupt_enter.s
|
||||||
interrupt/timer.cpp
|
interrupt/timer.cpp
|
||||||
loader/elf_loader.cpp
|
|
||||||
loader/init_loader.cpp
|
loader/init_loader.cpp
|
||||||
memory/kernel_heap.cpp
|
memory/kernel_heap.cpp
|
||||||
memory/kernel_stack_manager.cpp
|
memory/kernel_stack_manager.cpp
|
||||||
|
|
|
@ -1,68 +0,0 @@
|
||||||
#include "loader/elf_loader.h"
|
|
||||||
|
|
||||||
#include "debug/debug.h"
|
|
||||||
#include "memory/paging_util.h"
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
char ident[16];
|
|
||||||
uint16_t type;
|
|
||||||
uint16_t machine;
|
|
||||||
uint32_t version;
|
|
||||||
uint64_t entry;
|
|
||||||
uint64_t phoff;
|
|
||||||
uint64_t shoff;
|
|
||||||
uint32_t flags;
|
|
||||||
uint16_t ehsize;
|
|
||||||
uint16_t phentsize;
|
|
||||||
uint16_t phnum;
|
|
||||||
uint16_t shentsize;
|
|
||||||
uint16_t shnum;
|
|
||||||
uint16_t shstrndx;
|
|
||||||
} Elf64Header;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint32_t name;
|
|
||||||
uint32_t type;
|
|
||||||
uint64_t flags;
|
|
||||||
uint64_t addr;
|
|
||||||
uint64_t offset;
|
|
||||||
uint64_t size;
|
|
||||||
uint32_t link;
|
|
||||||
uint32_t info;
|
|
||||||
uint64_t addralign;
|
|
||||||
uint64_t entsize;
|
|
||||||
} Elf64SectionHeader;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint32_t type;
|
|
||||||
uint32_t flags;
|
|
||||||
uint64_t offset;
|
|
||||||
uint64_t vaddr;
|
|
||||||
uint64_t paddr;
|
|
||||||
uint64_t filesz;
|
|
||||||
uint64_t memsz;
|
|
||||||
uint64_t align;
|
|
||||||
} Elf64ProgramHeader;
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
uint64_t LoadElfProgram(Process& dest_proc, uint64_t base, uint64_t offset) {
|
|
||||||
Elf64Header* header = reinterpret_cast<Elf64Header*>(base);
|
|
||||||
dbgln("phoff: %u phnum: %u", header->phoff, header->phnum);
|
|
||||||
Elf64ProgramHeader* programs =
|
|
||||||
reinterpret_cast<Elf64ProgramHeader*>(base + header->phoff);
|
|
||||||
for (uint64_t i = 0; i < header->phnum; i++) {
|
|
||||||
Elf64ProgramHeader& program = programs[i];
|
|
||||||
dbgln(
|
|
||||||
"prog: type: %u, flags: %u, offset: %u\n vaddr: %m, paddr: %m\n "
|
|
||||||
"filesz: %x, memsz: %x, align: %x",
|
|
||||||
program.type, program.flags, program.offset, program.vaddr,
|
|
||||||
program.paddr, program.filesz, program.memsz, program.align);
|
|
||||||
auto mem_obj = MakeRefCounted<MemoryObject>(program.filesz);
|
|
||||||
mem_obj->CopyBytesToObject(base + program.offset, program.filesz);
|
|
||||||
dest_proc.vmas()->MapInMemoryObject(program.vaddr, mem_obj);
|
|
||||||
}
|
|
||||||
return header->entry;
|
|
||||||
}
|
|
|
@ -1,8 +0,0 @@
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include "object/process.h"
|
|
||||||
|
|
||||||
// Loads the elf program and returns its entry point.
|
|
||||||
uint64_t LoadElfProgram(Process& dest_proc, uint64_t base, uint64_t length);
|
|
|
@ -3,7 +3,6 @@
|
||||||
#include "boot/boot_info.h"
|
#include "boot/boot_info.h"
|
||||||
#include "debug/debug.h"
|
#include "debug/debug.h"
|
||||||
#include "lib/ref_ptr.h"
|
#include "lib/ref_ptr.h"
|
||||||
#include "loader/elf_loader.h"
|
|
||||||
#include "memory/paging_util.h"
|
#include "memory/paging_util.h"
|
||||||
#include "object/process.h"
|
#include "object/process.h"
|
||||||
#include "object/thread.h"
|
#include "object/thread.h"
|
||||||
|
@ -11,6 +10,66 @@
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char ident[16];
|
||||||
|
uint16_t type;
|
||||||
|
uint16_t machine;
|
||||||
|
uint32_t version;
|
||||||
|
uint64_t entry;
|
||||||
|
uint64_t phoff;
|
||||||
|
uint64_t shoff;
|
||||||
|
uint32_t flags;
|
||||||
|
uint16_t ehsize;
|
||||||
|
uint16_t phentsize;
|
||||||
|
uint16_t phnum;
|
||||||
|
uint16_t shentsize;
|
||||||
|
uint16_t shnum;
|
||||||
|
uint16_t shstrndx;
|
||||||
|
} Elf64Header;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t name;
|
||||||
|
uint32_t type;
|
||||||
|
uint64_t flags;
|
||||||
|
uint64_t addr;
|
||||||
|
uint64_t offset;
|
||||||
|
uint64_t size;
|
||||||
|
uint32_t link;
|
||||||
|
uint32_t info;
|
||||||
|
uint64_t addralign;
|
||||||
|
uint64_t entsize;
|
||||||
|
} Elf64SectionHeader;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t type;
|
||||||
|
uint32_t flags;
|
||||||
|
uint64_t offset;
|
||||||
|
uint64_t vaddr;
|
||||||
|
uint64_t paddr;
|
||||||
|
uint64_t filesz;
|
||||||
|
uint64_t memsz;
|
||||||
|
uint64_t align;
|
||||||
|
} Elf64ProgramHeader;
|
||||||
|
|
||||||
|
uint64_t LoadElfProgram(Process& dest_proc, uint64_t base, uint64_t offset) {
|
||||||
|
Elf64Header* header = reinterpret_cast<Elf64Header*>(base);
|
||||||
|
dbgln("phoff: %u phnum: %u", header->phoff, header->phnum);
|
||||||
|
Elf64ProgramHeader* programs =
|
||||||
|
reinterpret_cast<Elf64ProgramHeader*>(base + header->phoff);
|
||||||
|
for (uint64_t i = 0; i < header->phnum; i++) {
|
||||||
|
Elf64ProgramHeader& program = programs[i];
|
||||||
|
dbgln(
|
||||||
|
"prog: type: %u, flags: %u, offset: %u\n vaddr: %m, paddr: %m\n "
|
||||||
|
"filesz: %x, memsz: %x, align: %x",
|
||||||
|
program.type, program.flags, program.offset, program.vaddr,
|
||||||
|
program.paddr, program.filesz, program.memsz, program.align);
|
||||||
|
auto mem_obj = MakeRefCounted<MemoryObject>(program.filesz);
|
||||||
|
mem_obj->CopyBytesToObject(base + program.offset, program.filesz);
|
||||||
|
dest_proc.vmas()->MapInMemoryObject(program.vaddr, mem_obj);
|
||||||
|
}
|
||||||
|
return header->entry;
|
||||||
|
}
|
||||||
|
|
||||||
bool streq(const char* a, const char* b) {
|
bool streq(const char* a, const char* b) {
|
||||||
while (true) {
|
while (true) {
|
||||||
if (*a == '\0' && *b == '\0') return true;
|
if (*a == '\0' && *b == '\0') return true;
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
|
|
||||||
#include "common/gdt.h"
|
#include "common/gdt.h"
|
||||||
#include "debug/debug.h"
|
#include "debug/debug.h"
|
||||||
#include "loader/elf_loader.h"
|
|
||||||
#include "memory/paging_util.h"
|
#include "memory/paging_util.h"
|
||||||
#include "object/process.h"
|
#include "object/process.h"
|
||||||
#include "scheduler/scheduler.h"
|
#include "scheduler/scheduler.h"
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
#include "debug/debug.h"
|
#include "debug/debug.h"
|
||||||
#include "include/zcall.h"
|
#include "include/zcall.h"
|
||||||
#include "include/zerrors.h"
|
#include "include/zerrors.h"
|
||||||
#include "loader/elf_loader.h"
|
|
||||||
#include "object/process.h"
|
#include "object/process.h"
|
||||||
#include "scheduler/process_manager.h"
|
#include "scheduler/process_manager.h"
|
||||||
#include "scheduler/scheduler.h"
|
#include "scheduler/scheduler.h"
|
||||||
|
|
Loading…
Reference in New Issue