2016-09-06 15 views
0

私は基本的なメモリアドレッシングの仕組みを知っています。なぜなら、CPUがメモリのアドレス指定に使用するビットは2つの値しか持たないため、2の累乗にあるメモリ量を使用することが推奨される理由です。したがって、2ビットは4つの値をアドレス指定することができ、3は8をアドレス指定することができるので、Nビットは2^N値をアドレス指定することができる。最大メモリが2の累乗でないとき、コンピュータはメモリアドレッシングをどのように処理しますか?

私は別の番号を持っていますか?たとえば、160GBのメモリがサーバー(10x16GB)にインストールされているとします。

128ギガバイトのRAMを扱うためにXビットが必要であると仮定すると、CPUはアドレッシングにXビットを使用し、 "129-160"から利用可能なアドレスを無視するか、X + 1ビットを使用し、 ?無効なアドレスの代わりに、それらを仮想RAMとして使用しますか?

私は知っているすべての予約値として使用することもできますが、実際に何が起こるのか理解したいと思います。

+0

OSが16ビットの場合、EMMの「拡張メモリマネージャ」を使用して16ビットを超えるアドレッシングが可能になりました。その後、OSが32ビットの場合、4GBのメモリを扱うことができ、4GB以外のメモリはまったく使用されませんでした。ただし、Win32では3GBしか使用しませんでした。 64ビットでは最大メモリは実際にはテラバイトです。メモリがアドレス指定可能なメモリより大きいときはいつでも、CPUはアドレス可能なサイズを超えるメモリに到達する方法がありません。 – alvits

+0

CPUはハードウェアのビット幅でバインドされ、OSはソフトウェアのビット幅でバインドされます。 – alvits

答えて

1

この回答のためにPCを仮定すると、それはCPU以上のプラットフォームに依存するためです。

単純にその近くでは動作しません。しかし、最初に、

これはX + 1ビットを使用し、いくつかの無効なアドレスを持っていますか?

これは常にすべてのビットを使用しますが、CPUは無効なアドレスも気にしません。使用することができます。それは知らないので、気にすることはできません。

Who は、BIOSが知っていることを知っており、BIOS割り込みを使用してリニアアドレス空間のランドスケープがどのようになっているかを伝えます(おそらくOSです)。 "低メモリ"だけを検出する古いものはかなりシンプルで、メモリがどれくらいあるかを伝え、それをあなたに任せます(風景はそれほど複雑ではないので十分です)。 INT 0x15、EAX = 0xE820の「新しい」アドレスは、実際のマップを提供します。実際のマップは、リニアアドレス空間の範囲のリストと記述の形をしています。

実際のRAMはすべて、0から始まるきれいな連続した範囲にマップされています。チャンクにマップされ、たとえばメモリマップされたデバイスがマップされている穴で区切られます。

"低アドレス"(相対的に "低"ですが)に穴があるため、実際のRAMのいくつかは "上に"プッシュできます。したがって、RAMが4GBの場合、その一部は0xFFFFFFFFを超えるアドレスにマップされます。実際に穴がどこに依存しているか。メモリマップを読みます。

例として、マップは次のようになります。

memory map

最初の列は開始アドレスで、2番目の列はサイズで、最後の列がタイプです。タイプ1は通常のRAMであり、タイプ2はRAMではありません。タイプ3は読み込みたいものがありますが、それを済ませた後に使用することができます。さらに2つのタイプがあります。このマップは、VirtualBoxで4GBのRAMを使用して作成されました。しかしそれは正確にそれに追加されません。ポイントは、あなたは穴を見ることができます。

RAMが少ない場合、2番目のタイプ1の範囲は短くなりますが、残りの部分は同じように見えます(とにかく、どこか別の場所で表示されることが多い) - 32ビット境界付近のタイプ2の範囲そこにはまだ存在し、ただの束の下に直接マップされた "何もない"ものがあります。

したがって、アドレスにいくつかのビット数を使用するほど簡単ではありません。

関連する問題