从我的启动加载程序加载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函数的正确方法吗?”。

谢谢你的阅读,请帮忙。