2016-08-01 5 views
0

私はこの現実的な保護モードへの移行を研究していました。私は保護モードへの真実がldtとidtをロードせずにgdtをロードすることによって起こるかどうか疑問に思っていました。一方で、リアルモードプログラムをv8086モードに移行することなく保護モードで動作させることができないという疑念が生じましたか?リアルモードアプリケーションを保護モードで実行できない理由

ありがとう

答えて

2

LDTはオプションです。 IDTは、リアルモードIVTと同等の保護モードであり、同じ目的を果たします。 ISRと例外ハンドラへのエントリポイントについて説明します。ハードウェアとソフトウェアの割り込みと例外を処理できるようにするには、IDTが必要です。あなたがそれらなしで生きることができるならば、あなたはIDTを設定する必要はありません。

プロテクトモードに切り替えるには、GDTの設定とLGDTの実行だけではありません。適切なGDTエントリを指し示すセレクタを使用して、CR0ビット0を1に変更し、ジャンプを実行し、セグメント・レジスタをロードしてください(できれば、すべてのコンテキスト・スイッチ中に初期化されていないセグメント・レジスタの問題を回避する必要があります)。

セグメントレジスタのリアルモード値がプロテクトモードでは機能しないため、またsegment:offsetアドレスが有効なため、リアルモードコードは一般に保護モード(仮想8086(サブ)モードを除く)では実行できません。保護されたモード(GDTとページ変換で読み上げる)では異なった物理アドレスに変換されます。 IOWは、セグメントレジスタの値に1を加算すると、結果の物理アドレスに16を加算する効果がなくなります。さらに、同時に読み取り、書き込み、実行可能なセグメントを持つことはできません。

理論的には、セレクタNがベースアドレスN * 16の64KBセグメントのディスクリプタを選択するよりも、GDTディスクリプタおよび/またはLDTディスクリプタを設定することができます。実際にはそれは泥だらけです。ただし、Borland Pascal 7でこのスキームを実装したので、保護モードプログラムの記述方法と同じような方法で保護モードプログラムを記述することができます。

+0

セグメントで詳しく説明してください:保護モードでのオフセット変換? –

+3

@PantherCoder必須読書:インテル®64およびIA-32アーキテクチャー・ソフトウェア開発者マニュアル、vol。 3「システムプログラミングガイド」の第2章から第5章まで。 –

+0

はい、通常は16ビット保護モードでプロセッサを使用します。いくつかの初期のOSおよび環境によってメモリアクセスフォールトが発生すると、フォルトハンドラは、命令を適切に完了させ、フォルトの原因となった命令で再スタートさせるための一連のディスクリプタエントリを生成する。多くの場合、LOADALL命令を使用して非表示の記述子項目を直接ロードします。もちろん、これには落とし穴がたくさんありました。OSとプログラムを同時に実行したい場合は、ディスクリプタの一部が重複する可能性があるため、OSと保護モードプログラムを一緒に実行するのは難しいです。 –

関連する問題