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