4

引导加载程序分为 2 个阶段。第一阶段是用汇编编写的,只加载第二阶段,第二阶段是在 C 中。Stage1 将 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 删除了不应该删除的东西。

那我该如何执行这个 stage2.bin 呢?

据我了解,使用 32 位长度指令编写的 C 代码,而原始二进制文件只允许 16 个?

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


谢谢你的回答。

4

1 回答 1

7

. = 0x0500不对应0x0500:00x0500:0是物理地址0x5000,不是0x500

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

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

于 2012-07-17T10:41:48.353 回答