3

単純なasmブートローダーとc++カーネルを作成することにしました。チュートリアルをたくさん読みましたが、アセンブリファイルをコンパイルできません。次のようになります。

[BITS 32]
[global start]
[extern _k_main]
start:
   call _k_main
   cli
   hlt

(cファイルからk_main関数を呼び出したい)

コンパイル/アセンブル/リンクエラー:

nasm -f bin -o kernelstart.asm -o kernelstart.bin:
error: bin file cannot contain external references

では、.oファイルを作成してみました。

nasm -f aout -o kernelstart.asm -o kernelstart.o  (That's right)
ld -i -e _main -Ttext 0x1000 kernel.o kernelstart.o main.o
error: File format not recognized

誰かが私にplzの実用的な例を教えてくれるか、コンパイル方法を教えてくれます。:/(チュートリアルを閲覧していて、2日前に役立ちましたが、正しい答えが見つかりません)

4

1 に答える 1

3

私はあなたのエラーがどこから来たのかについて直接的な答えを持っていません。しかし、私は多くのことがうまくいかないのを見るので、ここにこれらを書きます:

nasm

nasm -f aout -o kernelstart.asm -o kernelstart

それも機能しますか?それは次のようなものでなければなりません

nasm -f aout -o kernelstart kernelstart.asm

ld

ld -i -e _main -Ttext 0x1000 kernel.o kernelstart.o main.o

ブートローダーとカーネルを作りたいとおっしゃっていたので、ここでの目標はld、MBRに入れられるものを出力することだと思います。その場合は、次の点に注意してください。

  • 出力形式を指定していません。MBRイメージを作成する場合は--oformat=binary、コマンドラインオプションに追加します。これにより、フラットなバイナリファイルが確実に生成されます。
  • エントリポイントをに設定し_mainます。そのシンボルがどこで定義されているかはわかりませんがstart、カーネルを呼び出す場所であるため、エントリポイントを指定する必要があると思います。
  • text0x1000から始まるセクションをリンクします。BIOSによってロードされるMBRにイメージを配置する場合は、0x7c00でリンクする必要があります。
  • 補足として、ブートローダーとカーネルを1つのイメージにリンクしようとしているようです。MBRは512バイトしか保持できないことを覚えておいてください(最後の2つには魔法の値が含まれているはずなので実際には510バイト)ので、そこにカーネルの多くを書き込むことはできません。別のカーネルイメージを作成し、これをブートローダーからロードする必要があります。

これらの点が問題の解決に役立つことを願っています。

また、 OSDevとして役立つ情報がたくさんあります。これは、 MBRのみを使用するリアルモードの「カーネル」を作成するためのチュートリアルです。チュートリアルには、動作するコードが含まれています。

于 2011-01-14T08:55:15.827 に答える