注意 - 我还没有设置分页,我的内核是多引导,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到调用函数时,出现了这个问题:
1 回答
这是问题所在
mbd->mods_addr
是模块结构表的地址 . 而不是模块本身的地址 . 那么解决方案是什么?