1
注 - 我还没有分页设置,我的内核是多引导的ELF。我有irqs和isrs完成。无法将平面二进制文件加载到内核中
所以我这里有这种气体文件:
.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文件到FL牛逼二元这些命令:
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但是当我去那里,我得到异常:无效的操作码。
这似乎是有用的,但不是:(
https://littleosbook.github.io/book.pdf#page=49&zoom=auto,-100,472
您应该尝试使用调试器。 _GDB_会很有用。你可以看到跳转发生时会发生什么。一个观察结果是,在mov之后,_start:mov $ 0xDEADBEEF,%eax'可能在内存中漫游。如果你用'jmp .'之类的东西进入无限循环会发生什么? –
如果您创建了一个最小的完整可验证示例,它将有所帮助。完成我们可以构建和测试的东西。 –
@MichaelPetch请看看编辑,顺便说一句,我刚刚意识到指针并没有指向任何_start标签。这似乎麻烦。 –