6

マシンの電源を入れてからカーネルを実行するまでの過程を理解しようとしています。私が収集したことから、最終的にはページ ディレクトリとページ テーブルを使用し、セグメンテーションをオフにして従来型の仮想メモリ プランに切り替える場合でも、起動時に保護モードに切り替えると、より多くのアドレス指定可能なメモリにアクセスできるようになると便利です。 .

保護モードに切り替えるには、次の 3 つのことを行う必要があるようです。

  1. グローバル記述子テーブル (gdt) をセットアップし、次のlgdt命令を使用してロードします。
  2. 制御レジスタ CR0 の PE フラグ/ビットを有効 (値 1) に設定します。
  3. で走り幅跳びをするljmp

gdt で使用するために、セグメント レジスタと命令ポインタをインデックスとオフセットに変換するロジックについて疑問に思っています。このロジックはハードウェアによって達成されますか? もしそうなら、どのハードウェアのljmp一部で、なぜプロセスの一部が実行されるのですか? CR0 に PE フラグを設定して、プロテクト モードを有効にしないのはなぜljmpですか?

4

1 に答える 1

6

最初の疑問は次のようなものです: Intel は、PE を設定するとプロテクト モードになるようにチップを設計しなかったのはなぜですか?

答え: これは実際には不可能です。CS レジスタには、ベース アドレスが 0x10*CS であるセレクタが含まれていると想定されます。

つまり、アドレス "mov CR0,EAX" がアドレス 0x0100:0x1200 にある場合、次に実行される命令はアドレス 0x0100:0x1203 になります。したがって、保護モードへの切り替えは、ジャンプ命令と組み合わせてのみ可能です。そうしないと、PE 自体を切り替えると、不要なジャンプが発生します (0x0100:0x1203 リアル モードから 0x0100:0x1203 保護モードへ)。

技術的には、CPU は使用されるすべてのセレクターのセレクター情報を内部に保存します。セレクタ レジスタが変更されるたびに、リミット、ベースなどがロードされます。つまり、CS レジスタのベース、リミットなどを更新するには、CS レジスタをロードする必要があります。つまり、ファー ジャンプを実行する必要があります (これにより CS レジスタがロードされるため)。たぶん、RETFも機能するでしょう...

他のセグメント レジスタ (DS など) のロードがファー ジャンプの前に既に機能しているかどうかはわかりません。そのため、ファー ジャンプの前に DS レジスタをロードすると、ベース アドレスと制限が GDT から取得されます。これを試してみるのもいいだろう...

于 2014-10-31T21:26:54.230 に答える