13

DSいくつかの dll を変更する必要がありますが、プロテクト モードでセグメント レジスタ ( 、SS、...) が正確に何をするのかわかりません。私は学校で実際の 16 ビット モードについて学びました。このモードでは、セグメント レジスタに 16 を掛けて、通常のレジスタのオフセットを足すと、物理メモリの実効アドレスが得られます。プロテクト モードでは、各プロセスが 4GB のメモリを「持つ」フラット メモリ モデルと仮想メモリがあるため、レジスタが 32 ビットの場合、仮想メモリの各バイトを「オフセット」レジスタによってのみアドレス指定できます。したがって、たとえば、保護モードのセグメントレジスタを持っている目的はどれですか。

mov eax, dword ptr ds:[20037DA0] 
4

3 に答える 3

10

いくつかの歴史的背景

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 を使用する操作に追加されるオフセットを明示的に与える特別なレジスタがあります。

于 2013-11-11T10:50:12.013 に答える
9

基本的な目的はリアル モードと同じですが、動作方法が若干異なります。あなたの例のDSは、ベースアドレス、エンドアドレス、粒度などの情報を含むGDT(本当にこれを理解したい場合は、この用語をグーグルで検索してください)で1つのメモリ記述子を選択します。次に、オフセットがベースアドレスに追加されます、 終わり。あなたがWindowsを使用している場合(Linuxでも同じだと思います)、フラットモデルと言ったように、一般的にこれらのセグメントレジスタについて心配する必要はありません。つまり、すべてのメモリに対して1つの記述子しかないはずです。変更しない場合これらのレジスタは、あたかも存在しないかのように機能するはずです。

于 2013-03-11T10:19:31.443 に答える