1

最近OSについて勉強中です。そして、リアルモードをプロテクトモードに変更し、シンプルなカーネルをロードするシンプルなブートローダーを書きたいと思っています。
しかし、エントリーアドレスの問題がわかりません。
まず、ブートローダーを OS.img(qemu) の最初のセクターに配置し、次にカーネルを 2 番目のセクターから開始します。
カーネルの readelf の結果 ここに画像の説明を入力
は次のとおりです。エントリ ポイント アドレスは 0x800c です。
LMA と VMA は次のとおりです。
ここに画像の説明を入力
elf タイプのカーネルを読み取り、エントリ ポイント アドレスである entry() に入るブートローダの一部。
ここに画像の説明を入力
ただし、ブートローダーを逆アセンブルすると、entry() は次のように なりますここに画像の説明を入力
。 *0x800c ではなく、*0x8018 を呼び出します。
なぜこれが起こるのかわかりません。手伝っていただけませんか?

4

1 に答える 1

1

call *0x8018に格納されているアドレスへの呼び出しを実行します。は であり、ヘッダー内の のオフセットはである0x8018ため、正しいです。ELFHDR0x8000e_entry0x18

本当の問題は、セグメントをメモリにロードする方法にあります。p_vaddr各セグメントは、ファイル offset からのアドレスにロードする必要がありますp_offsetp_vaddrあなたの場合、エルフヘッダーをロードしたメモリ内の同じ場所であることに注意してください。それが上書き0x8000される理由です。ELFHDR->e_entry最も簡単な解決策は、elf ヘッダーを別のアドレスにロードすることです。

ソース: http://www.skyfree.org/linux/references/ELF_Format.pdf

于 2012-04-29T20:42:27.053 に答える