从我的启动加载程序加载elf-i386
我正在做操作系统项目,直到现在我的bootloader都在运行。 我可以使用bios interuppt加载二进制文件,但我无法从ELF文件格式加载和调用C函数:
这是我想要最终执行的C程序:
//build :: cc -m32 -nostdlib -nostdinc -fno-builtin -fno-stack-protector -c -o kmain.o kmain.c void kmain(){ int a = 5; for(;;); }
这是调用kmain()的汇编代码
; build :: nasm -f elf loader.asm [BITS 32] [GLOBAL start] [EXTERN kmain] section .text start: mov eax, 0 call kmain
这是我的链接器脚本
ENTRY(start)
这就是我如何把所有东西连在一起
ld -m elf_i386 -T link.ld -o kernel loader.o kmain.o
现在从我的bootloader调用start
,我使用elf头的e_entry
偏移字段(距离起始地址24字节):
xor edx, edx mov edx, 24 add edx, IMAGE_PMODE_BASE add ebx, dword[edx] add ebx, IMAGE_PMODE_BASE call ebx
其中IMAGE_PMODE_BASE
是内存中加载的elf文件的地址。 我的问题是“这是以ELF文件格式加载和调用C函数的正确方法吗?”。
谢谢你的阅读,请帮忙。