2011-07-30 17 views
6

私は、各プロセスごとに別々のローカルディスクリプタテーブルを使用する小さな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が失敗していないことを確認したいだけです。

答えて

3

わかりました。私が使用していたタイプ(1001b)は、私が必要としていたものではありませんでした。 LDTエントリにタイプ2(10b)が使用されていることがわかりました。この情報は、i486マイクロプロセッサ・プログラマーズ・マニュアルの第6章の4ページにあります。私の機能的なGDTエントリは次のようになります:

localTable equ $-gdt   ; GDT entry #5 (selector 20h) 
dw 0x1FF      ; limit to 64 descriptors 
dw 0x8000      ; base address 
db 0x0 
db 0x82       ; 10000010b (segment present set, WTM) 
db 0x1f 
db 0x0 
関連する問題