设置起始地址以执行原始二进制文件

hru*_*ust 4 x86 linker gcc osdev bootloader

Bootloader分为两个阶段.第一阶段用汇编语言编写,只加载第二阶段,第二阶段在C阶段.阶段1加载C中的代码到地址0x0500:0,并跳转到那里.Stage2必须写"hello message"并停止.

我尝试了不同的方法将起始地址设置为原始二进制文件:(但没有任何效果)

cc -nostartfiles -nostdlib -c stage2.c
ld -s -T scrptfile.ld stage2.o /* I'm using ld just to set starting address of executable */
objcopy -O binary stage2 stage2.bin /* delete all unuseful data  */
Run Code Online (Sandbox Code Playgroud)

链接器脚本

SECTIONS
{
    . = 0x0500;
    .text : { *(.text)}
    .data : { *(.data)}
    .bss : { *(.bss)}
}
Run Code Online (Sandbox Code Playgroud)

也许我删除objcopy somethnig应删除.

那我怎么能执行这个stage2.bin呢?

据我所知,使用32位长度指令编写C代码,当原始二进制只允许16?

PS参数-set-start(objcopy)返回错误:无效的bfd目标.这是因为输出文件是二进制的?


谢谢你的回答.

Ale*_*nze 7

. = 0x0500不符合0x0500:0.0x0500:0是物理地址0x5000,而不是0x500.

此外,如果您尝试将C代码编译为32位并以实模式(16位)运行,则无法正常工作.您需要将代码编译为16位或将CPU切换为32位保护模式.没有那么多C编译器仍在编译16位代码.Turbo C++是其中之一,Open Watcom是另一个.AFAIK,gcc不能那样做.

最后,我猜你期望入口点在0x500:0(0x5000物理).你需要告诉链接器这个(我不记得如果可能的话)或者处理入口点的任意位置(即以某种方式从二进制文件中提取它).