9

仮想メモリ(セグメンテーション+ページング)に関するIntelのマニュアルを読んでいます。私が理解しているように、グローバルディスクリプタテーブル(GDT)を保持する特殊レジスタがあります。GDTには、NULL記述子、ローカル記述子テーブル、TSS、およびセグメント記述子が含まれています。また、ほとんどすべてのオペレーティングシステム(OS)には1つのGDTがあり、起動時に読み込まれ、変更できません(多分!!!)。私の質問は次のとおりです。

  1. これらのすべての情報(NULL、LDT、TSS、およびセグメント記述子)はどこに保存されますか?それらは物理メモリ、RAM、またはローカルハードドライブにありますか?
  2. セグメント記述子はコードセグメント(ASM:CS)、データセグメント(ASM:DS)、...と同じですか?もしそうなら、それらのいくつがGDTに保存されます(CSは1つ、DSは1つだけですか...) ?
  3. Protable Executable(PE)ローダーはこれらの情報のいずれかを操作しますか?
4

3 に答える 3

14

これらのすべての情報(NULL、LDT、TSS、およびセグメント記述子)はどこに保存されますか?それらは物理メモリ、RAM、またはローカルハードドライブにありますか?

CPUは、GDTの内容を内部的にキャッシュしない場合、時々、場合によっては常にアクセスする必要があります。CPUは、ディスクやその上のファイルシステムについて何も知らず、同じディスクにアクセスするOSに干渉しない方法も知らないため、ディスクから読み取って読み取ることはできません。OSもディスクから何かを取得する過程で、CPUにGDTから何かをフェッチさせることができるため、CPUはOSの助けに頼ることもできません。キャッチ22。

GDTをディスクにスワップアウトすることは本当に望ましくありません。上記の理由がない場合は、パフォーマンスへの影響が原因です。したがって、GDTは常にメモリ、物理メモリ(= RAM)にあります。

セグメント記述子はコードセグメント(ASM:CS)、データセグメント(ASM:DS)、...と同じですか?もしそうなら、それらのいくつがGDTに保存されます(CSは1つ、DSは1つだけですか...) ?

セグメントレジスタ(CS、DSなど)には、基本的にプロテクトモードのGDT(またはLDT)へのインデックスであるセグメントセレクタが含まれています。これらのインデックスは、記述子テーブル内のセグメント記述子をポイント/選択します。実モードと仮想8086モードでは同じですが、セグメントの位置とサイズ(プロテクトモードのテーブルから取得)は任意ではなく、ルックアップする必要がないため、テーブルが使用されない点が異なります。これらはすぐに計算されます。

以下の用語は異なる意味を持ち、混同したり、同じ意味で使用したりしないことに注意してください。

  • セグメントレジスタ
  • セグメントセレクター
  • セグメント記述子
  • セグメント記述子テーブル
  • セグメント

Protable Executable(PE)ローダーはこれらの情報のいずれかを操作しますか?

すべきではありません。少なくとも直接ではありません。ほとんどのWindowsプログラムは、CS、DS、ES、SSで同じセグメントセレクター値を使用します。これらのセレクターが指すGDTエントリは変更されず、グローバルであり、すべてのプログラム間で共有されます。

通常、プログラムとスレッド間で異なるのは、スレッドローカルストレージ(TLS)へのアクセスに使用されるセグメント(および場合によってはそのセレクター)だけです。FSまたはGSセグメントレジスタは、このTLSセグメントを指すセレクタを保持します。また、TLSへのすべてのアクセスは、適切なセグメントオーバーライドプレフィックス(FS:またはGS:)を使用する命令を使用して行われます。TLSは各スレッドに固有です。

于 2012-10-04T00:09:00.500 に答える
7

OSDev.orgは、GDTの優れた概要を示していますが、その実装の詳細を説明するチュートリアルの方がはるかに興味深いものです。(あなたはまた、その小さくて特権の少ないいとこ、LDTに興味があるかもしれません)

  1. GDTはメインメモリに常駐し、線形アドレス(を介してLGDT)を使用してロードされるため、ページングされたメモリにある可能性があります。

  2. はい(用語集を参照)。好きなセグメントベースを保存できます。通常、CSとDSは最小限です(SYSENTER/を使用する場合はユーザー+カーネルバージョンが必要ですSYSEXIT)。

  3. いいえ、それはむしろLDTを変更します(x86はそれらを交換するための機能を提供しますが、リアルモード命令を設定する必要があるGDTは提供せず、リアルモードとプロテクトモードの間をジャンプすることはできません)。

于 2012-10-03T20:28:36.027 に答える
1

上記の回答に同意しますが、質問番号2のより完全な回答は次のようになります。
セグメント記述子は、セグメントのサイズ、セグメントのアクセス権と特権レベル、セグメントタイプ、およびの最初のバイトの位置を指定します。線形アドレス空間のセグメント(セグメントのベースアドレスと呼ばれます)。したがって、セグメント記述子はCS、DS、...レジスタだけではありません。

于 2016-07-04T13:14:45.623 に答える