注意 - 我还没有设置分页,我的内核是多启动的,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
答案 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");