无法将平面二进制文件加载到内核中

时间:2016-12-25 15:09:12

标签: operating-system osdev

注意 - 我还没有设置分页,我的内核是多启动的,ELF。我确实有irqs和isrs完成。

所以我在这里有这个GAS文件:

menuentry "fOS-Terminal (25x80)" {
    multiboot /boot/fos.elf
    module /modules/program.bin
    set gfxmode=80x25
}

GRUB2设置加载平面二进制文件:

typedef void (*call_module_t)(void);
call_module_t start_program = (call_module_t)mbd->mods_addr;
start_program();

在我的kernel.c中,我可以解析多引导头以获取模块的地址,我称之为:

i686-elf-as --32 ./iso/modules/program.s -o ./iso/modules/program.o

i686-elf-ld -fPIC -shared --oformat binary ./iso/modules/program.o -o ./iso/modules/program.bin

现在我正在尝试使用这些命令将我的GAS文件编译成平面二进制文件:

{{1}}

问题 - GRUB2肯定正在加载内核,多引导头告诉我它在地址 - 0x100ac但是当我去那里时,我得到了异常:INVALID OPCODE。

这似乎有帮助,但不是:(

https://littleosbook.github.io/book.pdf#page=49&zoom=auto,-100,472

编辑 - 1所以当我调用调用函数时,会出现这样的情况: The pointer seems to point nowhere

1 个答案:

答案 0 :(得分:0)

这是问题

typedef void (*call_module_t)(void);
call_module_t start_program = (call_module_t)mbd->mods_addr;
start_program();

mbd->mods_addr是模块结构表的地址。而不是模块本身的地址。 那么解决方案是什么?

unsigned int* modules = (unsigned int*)mbd->mods_addr;
if (mbd->mods_count > 0)
{
    unsigned int addr = modules[0];
    unsigned int size = modules[1];
    call_module_t start_program = (call_module_t)addr;
    start_program();
}
else
    painc("module wasn't loaded");