从我的启动加载程序加载elf-i386

时间:2018-01-12 15:58:15

标签: c assembly bootloader osdev

我正在做操作系统项目,直到现在我的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 header中的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文件格式加载和调用C函数的正确方法吗?”。

感谢您的阅读,请帮忙。

0 个答案:

没有答案