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目标。这是因为输出文件是二进制文件?
感谢您的回答。
答案 0 :(得分:6)
. = 0x0500
与0x0500:0
不符。 0x0500:0
是实际地址0x5000
,而不是0x500
。
另外,如果您尝试将C代码编译为32位并以实模式(16位)运行,则无法正常工作。您需要将代码编译为16位或将CPU切换为32位保护模式。没有那么多C编译器仍在编译16位代码。 Turbo C ++是其中之一,Open Watcom是另一个。 AFAIK,gcc不能这样做。
最后,我猜你期望入口点为0x500:0(0x5000物理)。你需要告诉链接器(我不记得如果可能的话)或者处理入口点的任意位置(即以某种方式从二进制文件中提取它)。