2012-07-16 55 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