首页 文章

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

提问于
浏览
1

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

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

.section .text
.global _start

_start:
    mov $0xDEADBEEF, %eax

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

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

在我的kernel.c中,我可以解析多引导头以获取模块的地址,我正在调用它:

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

现在我正在尝试使用以下命令将我的GAS文件编译为平面二进制文件:

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

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

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

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

编辑 - 1所以当我gdb到调用函数时,出现了这个问题:
The pointer seems to point nowhere

1 回答

  • 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");
    

相关问题