これらのすべての情報(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は各スレッドに固有です。