最近OSについて勉強中です。そして、リアルモードをプロテクトモードに変更し、シンプルなカーネルをロードするシンプルなブートローダーを書きたいと思っています。
しかし、エントリーアドレスの問題がわかりません。
まず、ブートローダーを OS.img(qemu) の最初のセクターに配置し、次にカーネルを 2 番目のセクターから開始します。
カーネルの readelf の結果
は次のとおりです。エントリ ポイント アドレスは 0x800c です。
LMA と VMA は次のとおりです。
elf タイプのカーネルを読み取り、エントリ ポイント アドレスである entry() に入るブートローダの一部。
ただし、ブートローダーを逆アセンブルすると、entry() は次のように
なります
。 *0x800c ではなく、*0x8018 を呼び出します。
なぜこれが起こるのかわかりません。手伝っていただけませんか?
1 に答える
1
call *0x8018
に格納されているアドレスへの呼び出しを実行します。は であり、ヘッダー内の のオフセットはである0x8018
ため、正しいです。ELFHDR
0x8000
e_entry
0x18
本当の問題は、セグメントをメモリにロードする方法にあります。p_vaddr
各セグメントは、ファイル offset からのアドレスにロードする必要がありますp_offset
。p_vaddr
あなたの場合、エルフヘッダーをロードしたメモリ内の同じ場所であることに注意してください。それが上書き0x8000
される理由です。ELFHDR->e_entry
最も簡単な解決策は、elf ヘッダーを別のアドレスにロードすることです。
于 2012-04-29T20:42:27.053 に答える