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

时间:2012-07-16 23:41:23

标签: c x86 bootloader osdev

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  */

链接描述文件

SECTIONS
{
    . = 0x0500;
    .text : { *(.text)}
    .data : { *(.data)}
    .bss : { *(.bss)}
}

也许我删除objcopy somethnig应删除。

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

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

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


感谢您的回答。

1 个答案:

答案 0 :(得分:6)

. = 0x05000x0500:0不符。 0x0500:0是实际地址0x5000,而不是0x500

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

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