0

カーネル用のブートローダーを作成しようとしています。現時点ではアセンブリで GDT をロードしていますが、GDT (および IDT) を生成する C コードを書きたいと考えています。問題は、ブート セクタが常にアドレス 0x7c00 にロードされるため、ラベルをオフセットする方法が必要なことです。そのアドレスで。bin ファイルにアセンブルする場合は [org 0x7c00] を使用できますが、外部シンボルを使用できるように、ブートローダーをオブジェクト ファイル (この形式では NASM によってサポートされていない組織) にアセンブルしたいと考えています。組織がなければ、アセンブリ コードに次のように記述します。

gdt_descriptor:
dw gdt_end - gdt_start - 1
dd gdt_start            
.
.
.
lgdt [gdt_descriptor]

組み立てると次のようになります。

lgdt 0x71

いつあるべきか

lgdt 0x7c71

gdt の開始位置がオフセットを考慮していないため、テーブル自体も間違っています。

自分でオフセットを手動で追加するために保存します(必要な場所がたくさんあります)。開始アドレスを設定するために使用できるディレクティブはありますか?

編集: 0xc700 から 0x7c00 に変更

4

1 に答える 1

0

オブジェクト ファイルにアセンブルする場合は、おそらくそれをリンクします。リンカに物を配置する場所を伝えることができます。ただし、自分のものを別のセクションに入れる必要があるかもしれません。

また、ブートセクタ コードは 16 ビット リアル モードであるのに対し、C コードは通常 32/64 ビット プロテクト モード コードであることに注意してください。そのため、通常、これらをリンクするのは簡単ではありません.CからGDTを「生成」する方法はわかりません...

于 2015-05-19T21:10:39.380 に答える