いくつかの歴史的背景
8086 は常にセグメントごとに固定の 64KiB ウィンドウを使用し、その開始アドレスは (セグメント レジスタ * 16) によって計算されました。80286 以降、メモリにはいくつかの特別なテーブル (GDT および LDT) があります。これらのテーブルには、セグメントの開始アドレス、長さ、およびアクセス権が含まれています。セグメント レジスタ (CS、DS、ES、SS - および 80386 以降: FS、GS) には、これらのテーブルへのインデックスが含まれています。
したがって、理論的には、オペレーティング システムはセグメントのオフセットと長さを希望どおりに設定できます。32 ビット モードでは、DS=0x0123 は次のことを意味します。セグメントはアドレス 0xABCD で始まり、長さは 0xEF バイトです。これは、オペレーティング システムによって作成された GDT および LDT テーブルの内容によって異なります。この範囲外のセグメント (長さが 0x1000 未満の場合は DS:0x1000) にアクセスしようとすると、例外 (割り込み) が発生します。
現在の状況
ただし、最新の 32 ビット オペレーティング システムのほとんどは、実際にはセグメント レジスタを使用しなくなりました。アクセス権の問題のため、これらの値はモード (カーネルまたはユーザー) に応じて設定されます。通常、開始アドレスは 0 で、長さは 4GiB です。
実際のメモリ保護は MMU を使用して行われるため、ユーザー モードではメモリの一部の領域にアクセスできません。最新のオペレーティング システムでは、MMU は絶対に不可欠です。「絶対」仮想アドレスを実際の物理アドレスにマップし、アクセス権違反をチェックします。
例外が 1 つあります。一部のオペレーティング システム (Windows や Linux など) では、FS セグメントや GS セグメントを使用して、実際には別のメモリ領域を指しています。
このため、64 ビット モードでは、x86 プロセッサはアクセス権の問題にのみ CS レジスタを使用し、FS と GS を使用して各アドレスにオフセットを追加できます。私が知る限り、DS、ES、および SS は使用されませんが、レジスタ FS および GS の内容は重要ではありませんが、FS または GS を使用する操作に追加されるオフセットを明示的に与える特別なレジスタがあります。