2012-07-16 57 views
3

引导加载程序分为2个阶段。第一阶段用汇编语言编写,只加载第二阶段,第二阶段用C语言编写。Stage1加载C语言中的代码到地址0x0500:0,然后跳转到那里。 Stage2必须编写“hello消息”并停止。设置开始地址以执行原始二进制文件

我尝试不同的方式来起始地址设置为原始二进制所作:(但没有奏效)

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是shouldt删除删除。

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

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

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


谢谢你的答案。

+0

你能告诉我们你的链接脚本吗?如果你拆解它,你的代码看起来合理吗? – 2012-07-16 23:52:51

回答

6

. = 0x0500不对应0x0500:00x0500:0是物理地址0x5000,而不是0x500。此外,如果您试图将C代码编译为32位并以实模式(即16位)运行,则它将无法工作。您需要将代码编译为16位或将CPU切换到32位保护模式。还没有那么多C编译器仍在编译16位代码。 Turbo C++是一个,Open Watcom是另一个。 AFAIK,gcc无法做到这一点。

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

+0

http://bellard.org/tcc/tccboot.html可能有助于内核开发。 – 2012-07-17 16:48:41