私は、各プロセスごとに別々のローカルディスクリプタテーブルを使用する小さなOSで作業しています。私はlldt
命令を使用してGDTからLDTセグメントをロードする必要があることを理解しています。有効なGDTを使って保護モードでカーネルを実行していますが、LDTのGDTエントリがどのように表示されるかはわかりません。私は基本アドレスが私のLDTを指すはずであることを理解していますが、私は特権レベルと他の属性がどんなものであるべきか分かりません。ここに私のGDTでLDTエントリを表しNASMコードは次のとおりです。LLDTの使用とそのためのGDTの設定
localTable equ $-gdt ; GDT entry #5 (selector 20h)
dw 0x1FF ; limit to 64 descriptors
dw 0x8000 ; base address
db 0x0
db 0x89 ; probably incorrect...
db 0x1f ; possibly incorrect...
db 0x0
あなたはNASMの文法に精通していない場合、このテーブルのエントリは、0x8000ののベースアドレスおよび511(512バイトの合計の制限があり、または64エントリ)。私はGDTとLDTに関するセクションをi486プログラマーのリファレンスマニュアルで読んだことがありますが、私のGDTエントリーがどのように見えるべきかを完全に理解することはできません。
とにかく、私はそうのようなLDTをロード:
mov ax, 0x20
lldt ax
このコードは(私が割り込みでそれを扱う)一般保護違反を生成するために、プロセッサが発生します。
1)私はLDTをGDTに正しく記述しましたか?そうでない場合は、何を変更する必要がありますか? 2)LDT自体に無効なセレクタがあるため、LLDT
命令が失敗する可能性がありますか?私はLLDTの命令仕様を読んでいて、それはLDTのメモリを読み込むことさえできないようですが、LDTのデータに誤字があるのでLLDTが失敗していないことを確認したいだけです。