2011-01-13 3 views
3

シンプルなasmブートローダとC++カーネルを書くことにしました。私は、チュートリアルをたくさん読んで、私はアセンブリファイルをコンパイルカントこのように思える:ブートセクタからC++カーネルへ

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

(私はCファイルからk_main機能番目呼び出すしたいと思います)

コンパイルは/組み立て/エラーをリンク:

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は作業試験を私を与える:

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

は大丈夫、私は.oファイルを作成してみましたどのようにコンパイルするかを言いなさい。 :/ (私は2日前にチュートリアルを閲覧していますが、正解を見つけることができません)

+0

LinuxまたはWindows上にありますか? –

+0

ああ、書くのを忘れた:窓 – SeBee

答えて

3

私はあなたのエラーがどこから来たのかについて直接的な回答はありません。しかし、私は間違って多くのことを参照していますので、私はここにこれらを記述します:

NASM

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

でも動作することをしていますか?それはあなたがブートローダとカーネルを作りたいと言っているので、私はここにあなたの目標を仮定していることができld出力何かを作ることです何か

nasm -f aout -o kernelstart kernelstart.asm 

のようなLD

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

する必要がありますMBRに入れてください。その場合は、次の点に注意してください。

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

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

また、有用な情報の多くはOSDevです。 Hereは、MBRだけを使用するリアルモードの "カーネル"を作成するためのチュートリアルです。チュートリアルには作業コードが含まれています。

+1

投稿されたアセンブリコードも32ビットコードです。ほとんどのBIOSの実装では、ブートローダは16ビットコードのリアルモードで実行されます。 – ughoavgfhw

関連する問題