5

セグメント化されたメモリ モデルで動作する 32 ビット オペレーティング システムの場合、それでも4GBの制限になりますか?

Intel Pentium Processor Family Developer's Manualを読んでいたところ、セグメント化されたメモリ モデルでは最大64TBのメモリをマップできると記載されていました。

「メモリ編成のセグメント化モデルでは、論理アドレス空間は、それぞれ最大 4 ギガバイトの 16,383 セグメント、または合計で 2^46 バイト (64 テラバイト) のセグメントで構成されます。プロセッサは、この 64 テラバイトの論理アドレスをマップします。第 11 章で説明されているアドレス変換メカニズムによって、空間を物理アドレス空間に変換します. アプリケーション プログラマは、このマッピングの詳細を無視できます. セグメント化モデルの利点は、各アドレス空間内のオフセットが個別にチェックされ、各セグメントへのアクセスが個別にできることです.制御されます。

代替テキスト

これは複雑な質問ではありません。テキストを正しく理解していることを確認したいだけです。Windows またはその他の OS がフラット モデルではなくセグメント化されたモデルで動作する場合、メモリ制限は 64 TB になりますか?


アップデート:

代替テキスト

Intel の 3-2 3a システム ドキュメント。


代替テキスト

http://pdos.csail.mit.edu/6.828/2005/readings/i386/c05.htm


セグメント レジスタは、従来のリアル モードの意味で考えるべきではありません。セグメント レジスタは、グローバル ディスクリプタ テーブルのセレクタとして機能します。

保護モードでは、A:B 形式の論理アドレスを使用してメモリをアドレス指定します。リアル モードと同様に、A はセグメント パーツで、B はそのセグメント内のオフセットです。> 保護モードのレジスタは 32 ビットに制限されています。32 ビットは、0 ~ 4Gb の任意の整数を表すことができます。B は 0 ~ 4Gb の任意の値にできるため、セグメントの最大サイズは 4Gb になりました (リアル モードと同じ理由)。今違いのために。保護モードでは、A はセグメントの絶対値ではありません。保護モードでは、A はセレクターです。セレクターは、グローバル記述子テーブル (GDT) と呼ばれるシステム テーブルへのオフセットを表します。GDT には、記述子のリストが含まれています。これらの各記述子には、セグメントの特性を説明する情報が含まれています。

セグメント セレクターは、ページングでは実現できない追加のセキュリティを提供します。

これらの方法 [セグメンテーションとページング] にはどちらも利点がありますが、ページングの方がはるかに優れています。セグメンテーションはまだ使用可能ですが、メモリ保護および仮想メモリの方法として急速に時代遅れになっています。実際、x86-64 アーキテクチャでは、一部の命令が正しく動作するために、フラット メモリ モデル (基数が 0 で制限が 0xFFFFFFFF の 1 つのセグメント) が必要です。

ただし、セグメンテーションは x86 アーキテクチャに完全に組み込まれています。それを回避することは不可能です。ここでは、独自のグローバル記述子テーブル (セグメント記述子のリスト) を設定する方法を示します。

前述のように、フラット メモリ モデルを設定してみます。セグメントのウィンドウは 0x00000000 から始まり、0xFFFFFFFF (メモリの最後) まで拡張する必要があります。ただし、セグメンテーションでは実行できてページングでは実行できないことが 1 つあります。それは、リング レベルの設定です。

- http://www.jamesmolloy.co.uk/tutorial_html/4.-The%20GDT%20and%20IDT.html

たとえば、GDT には、さまざまなユーザーのアクセス レベルとメモリ アクセスの領域が一覧表示されます。

サンプル GDT テーブル

GDT[0] = {.base=0, .limit=0, .type=0};             
// Selector 0x00 cannot be used
GDT[1] = {.base=0, .limit=0xffffffff, .type=0x9A}; 
// Selector 0x08 will be our code
GDT[2] = {.base=0, .limit=0xffffffff, .type=0x92}; 
// Selector 0x10 will be our data
GDT[3] = {.base=&myTss, .limit=sizeof(myTss), .type=0x89}; 
// You can use LTR(0x18)

http://wiki.osdev.org/GDT_Tutorial#What_should_i_put_in_my_GDT.3F

ページング部分は、物理メモリにマップされるものです。(PAE) は、最大 64 GB の追加メモリを提供するものです。

要するに。答えはノーです。論理メモリは 4GB を超えることはできません。Intel Pentium Processor Family Developer's Manual の64TB の主張は誤植だと思います。

4

5 に答える 5

2

要求は、64TB の論理アドレス空間です。メモリのページングを有効にすることで、物理的な制限を回避できるため、物理的なメモリの制限を持ち出すことは重要ではありません。

ただし、セグメント セレクターのインデックス フィールドは 16 ビットであり、テーブル インジケーターの 1 ビットと要求保護レベルの 2 ビットを差し引いたものであり、合計 8,192 (13 ビット) のセグメント セレクターが残るため、これはまだ少し誤解を招く主張です。8,192 個の 4GB セグメントでは、GDT (グローバル記述子テーブル) または LDT (ローカル記述子テーブル) のいずれかで 32TB の論理メモリにしかアクセスできませんでした。64TB の論理メモリにアクセスできるようにするには、GDT と LDT の両方を 16,384 個の一意のセグメントで完全に利用する必要があります。

とにかく、最初の質問は「4GB の制限はありますか」で、答えは「いいえ」です。セグメンテーションとページングの両方が有効になっている 32 ビット システムでは、たとえば、コード セグメント (CS) に 512MB、スタック セグメント (SS) に 1GB、データ セグメント (DS) に 4GB を割り当てることができます。

セグメント化されたメモリ モデルを使用した場合、OS が 64 TB に制限されるかどうかという 2 番目の質問に対する答えは、それほど単純ではありません。メモリ マネージャを提供するのは、OS の仕事です。明らかに、32GB の RAM という物理的な制限があります。32 ビット Linux は、ページングを使用するため、各アプリケーションに 4GB のフラットなアドレス空間を提供できます (カーネル/ユーザー分割の詳細は無視されます)。そして、すべてのプロセスは、4GB の物理アドレス空間があると認識しています。

要約すると、セグメンテーションの制限とページングの制限を混同していると思います。ページングにより、システムまたはアプリケーションは、物理的に利用可能な RAM よりも多くの RAM を使用できます。セグメンテーションにより、プロセスは論理的にアドレス指定可能な複数の 32 ビット セグメントにマップできます。フラット モードでもセグメンテーションが使用されますが、すべてのセグメント レジスタが同じベース アドレスにマップされることに注意してください。

于 2014-08-15T06:37:39.210 に答える
2

編集:私の答えは、「4GB制限」によって、物理アドレス空間ではなく、線形(仮想)アドレス空間の最大サイズを参照していることを前提としています。以下のコメントで説明されているように、後者は実際には 4GB に制限されていません。フラット メモリ モデルを使用している場合でも同様です。


強調して引用を繰り返します。

論理アドレス空間は、それぞれ最大 4 ギガバイトの 16,383 ものセグメントで構成されています

ここで、「Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 1: Basic Architecture」からの引用 (PDFはこちらから入手可能):

内部的には、システム用に定義されたすべてのセグメントがプロセッサの線形アドレス空間にマップされます。

(32 ビット プロセッサ上で) 4GB に制限されているのは、この線形アドレス空間です。そのため、セグメント化されたメモリ モデルは引き続き制限の対象となります。

于 2010-10-28T03:03:54.660 に答える
2

昔を覚えていますか?64kb セグメントのリアルモードの x86 上の DOS? FARポインタ?HMA? XMS? メモリの量が増えるにつれて、プロセッサが通常処理できるよりも多くのメモリを使用する方法が見つかりました。しかし、それは醜かった。

確かに 32 ビットのセグメンテーションを使用できますが、なぜでしょうか? 必要はありませんでした。32 ビット プロセッサが登場したとき、4Gb の制限は十分すぎるほどだったので、フラット モデルを使用する決定が下されました。

また、32 ビット OS は 4Gb 以上を使用できます。これは、4Gb のアドレス空間に制限されているプロセスです (Windows では 2 つまたは 3 つでも)。

于 2010-10-28T03:06:25.860 に答える
0

私の知る限り、OSの他の制限により、答えは「必ずしも」ではありません。メモリの最大サイズを理論上の制限よりも十分に低く抑えたい場合があります。これにより、一部の内部メモリ構造が小さくなり、パフォーマンスが向上する可能性があるからです。しかし、私は本当に知りません...私はマーク・ルシノビッチではありません...

PAEを見てください。これはあなたが話していることだと思いますが、私は64ビットポインターに卒業したので、ケンタッキーストレートバーボンウイスキーでウィンドウメモリモデルを処理する脳細胞を殺すことにしました.

于 2010-10-28T03:14:11.743 に答える
-1

Intelのセグメント化モデルは16,384セグメントに制限されています。それは本当に便利にするには少なすぎる数です。システムが20億から40億のセグメント間ですばやく切り替えることができれば、もっと良かったでしょう。64ビットの線形空間ではなく、それが私が見たかったものです。割り当てられた各オブジェクトを異なるセグメントに効率的に配置できる設計では、割り当てられた個々のオブジェクトごとに余分なオーバーヘッドの範囲をチェックせず、実行中のコードへの影響を最小限に抑えてオブジェクトを再配置できます(CPUが現在選択されているセグメントが無効化)など。ただし、オブジェクト参照は、64ビットポインタの半分のスペースをキャッシュ内で使用する必要があります。

于 2010-10-28T03:55:17.207 に答える