4

ブートローダーは2つのステージに分かれています。最初のステージはアセンブリで記述され、2番目のステージのみをロードし、2番目のステージはCにあります。Stage1はCのコードをアドレス0x0500:0にロードし、そこにジャンプします。Stage2は「hellomessage」を書き込んで停止する必要があります。

開始アドレスを次の人が作成した生のバイナリに設定するさまざまな方法を試しました:(しかし何も機能しませんでした)

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を実行できますか?

私が理解しているように、生のバイナリが16しか許可しない場合、32ビット長の命令を使用してCコードを記述しますか?

PSパラメータ-set-start(objcopy)はエラーを返します:無効なbfdターゲット。出力ファイルがバイナリだからですか?


回答ありがとうございます。

4

1 に答える 1

7

. = 0x0500に対応していません0x0500:00x0500:0は物理アドレス0x5000であり、ではありません0x500

また、Cコードを32ビットとしてコンパイルし、リアルモード(16ビット)で実行しようとすると、機能しません。コードを16ビットとしてコンパイルするか、CPUを32ビットプロテクトモードに切り替える必要があります。まだ16ビットコードをコンパイルしているCコンパイラはそれほど多くありません。Turbo C ++はその1つであり、OpenWatcomはもう1つです。AFAIK、gccはそれを行うことができません。

最後に、エントリポイントが0x500:0(0x5000物理)にあることを期待していると思います。これをリンカに伝えるか(可能であれば、どのようにすればよいかは覚えていません)、エントリポイントの任意の場所を処理する(つまり、バイナリから何らかの方法で抽出する)必要があります。

于 2012-07-17T10:41:48.353 に答える