http://mag.autumn.org/Content.modf?id=20050119154552
こちらのページを読んでいて色々わかりませんでした。
>物理的にCPUに接続できるメモリのメモリ空間は、主にCPUからアドレスバスが何本出ているかで決まります。
>プログラムがアクセス可能なメモリ空間は、CPUの論理的なアーキテクチャで決まります。
これらの意味の違いはどういったことでしょうか。
知識が浅いので簡単な言葉で教えていただけると助かります。
よろしくお願いします。
>物理的にCPUに接続できるメモリのメモリ空間は、主にCPUからアドレスバスが何本出ているかで決まります。
まず、メモリ内部は小さなデータを保存する区画があり、それぞれに0、1、2、…と番号付けされていると考えてください。(アドレスといいます)
ここまではOKでしょうか?
さて、CPUがメモリとデータをやり取りする場合、メモリの何番地のデータを読み書きするのかを指定してやらねばなりません。
当然CPUもメモリも電気的なデバイスですから電気的に番地を指定してやらないといけません。
ということはCPUとメモリとの間に番地を指定するための配線があるはずです。これをアドレスバスといいます。
アドレスバスではOn/Offの2値しか区別できないとします。(実際デジタル回路ですからそうなっています)
すると1本のアドレスバスで指定できる番地の種類はOn/Offの2通りしかありません。
つまり2つ分しかメモリの中の保存区画を利用することができないことを意味します。
さて、アドレスバスが2本になるとどうなるかというとそれぞれにOn/Offの状態をとれるわけですから2×2の4つ分利用できます。
同様にアドレスバスがn本だと2のn乗分だけの区画を利用できることになります。
>プログラムがアクセス可能なメモリ空間は、CPUの論理的なアーキテクチャで決まります。
CPUのデータ転送命令ではメモリ空間へのアクセスは○○をメモリの××に書き込むといった命令があります。
ここで番地指定のことをアドレッシングといいます。
アドレッシングにはCPUによってもさまざまな方法がありますが一般的にこの番地もデータである以上指定できる番地数に上限があります。
これがCPUの論理的なアーキテクチャで決まることになります。
まとめると、
前者がアドレスバス用に用意されている物理的な配線の数であり、2のn乗の番地指定が限界になります。
後者がCPUの命令として許容できる番地の数の上限です。
ただし通常この限界は同じ、もしくは同程度です。
CPUからのアドレスバスを直接1つのメモリにつないだときはアドレスバスの数でアドレスがきまる。
だから32ビットCPUは2の32乗の4GBのメモリ空間にアクセスできる。
でも例えば、CPUからメモリ1、メモリ2にアドレスバスを平行につないであげて、何かのコマンドで
これからメモリ1にアクセスします
これからメモリ2にアクセスします
と制御できるとしたら?
メモリ1で4GB、メモリ2で4GBの合計8GBのメモリ空間にアクセスできる。
この例は極端かもしれないけど32ビットのアドレスバスだからって4GBしかアクセスできないわけじゃないということ。
アドレスバスの本数の意味は既に回答されているので、
「CPUのbit数はここで言うアドレスパスorアドレッシングできる数の、
どちらかと同義でしょうか??」
答えはどちらでもありません。どちらかと言えば「アドレッシングできる数」
と同義のことが多いのですが、あらゆるCPUにこの定義があてはまるわけでは無いため、
良く混乱を引き起こします。
CPUの中にはメモリとは別に、様々な処理のためにデータを溜めておくレジスタというものがあります。
この中でも通常の四則演算等に利用する汎用レジスタのビット数=CPUのビット数とすることが多いです。レジスタにも色々な種類があり、「メモリのアドレッシングに使うレジスタ」のbit数が
ほぼ「CPUの論理的なアーキテクチャ」になります。
最近の32bitや64bitのCPUでは汎用レジスタがアドレッシングにも使われるため、汎用レジスタのビット数=主要な演算器のビット数=アドレッシング可能なビット数の関係が成り立っていますが、そうでないCPUも世の中にはたくさんあります。
特に昔の8bitや16bitのCPUでは汎用レジスタや演算器は8bitや16bitでも、メモリのアドレッシングは複数のレジスタを組み合わせてレジスタのビット以上のアドレッシングができるものが多くあります。Intelの8086は16bit CPUですが、論理的には20bitのアドレッシング能力がありました。
一方でCPU内部では例えば32bitのレジスタを持っており、32bitのアドレッシングができても、
CPU(LSI)の外部に32本のアドレス線が出ているとは限りません。これはその時代のメモリコスト
から見て、まだ32bit=4GBというメモリ搭載量が現実的でなかったり(つまりメモリの値段がばか
高くて、とても実現できない)、システムの要求的にそれほどのメモリ量を必要しなかったり
する場合に、LSIそのものや、マザーボードのコストを下げるためにアドレス線の本数を
減らします。
以下のURLは64bit CPUと実際のアドレス線の本数に例が載っています。
http://www.itmedia.co.jp/enterprise/articles/0506/08/news003.htm...
ご回答ありがとうございます。
上記のページを見てみましたが、
実際のアドレス線の本数=物理アドレス
という認識であっていますか??
またここで、
仮想アドレスと物理アドレスの差分は、
仮想メモリとして用いることのできるサイズということでよろしいでしょうか??
とんちんかんなことを言っていたら申し訳ないです。
Hi,
16ビットCPUでまず考えてください。
以下のCPUは16ビットCPUです。
・8086 ->1M
http://ja.wikipedia.org/wiki/Intel_8086
・80286 ->16M
まず、「CPUのビット数」は単なるマーケティングのキーワードで、技術的に定義があるわけではありません。よって、一概にアドレス空間との関係は言えません。最初に参照されている文書は、そのあやふやなところを付いた、技術的にはただしい文書のようです。わざと奇を衒って書いてあるので、混乱するのも無理はありませんが。
なにをもって「CPUのビット数」とするかには諸説ありました(データバスの幅、演算レジスタの幅など)。
ただ、近年の 64bit CPU (Alpha, MIPS64, AMD64) では、論理的にアドレスできる空間の bit数が問題になってます。なぜなら、そもそもデータベースなどで (4GBを越えるよな) 巨大なデータをアプリケーションから簡単に扱いたいというのが 64bit化のモチベーションになってるので。
だからこそ逆に「32bit CPUは 4GBしかつかえない」という「都市伝説」もうまれるわけです。これは、正確には参照された文書の述べるように間違いです。普通の使い方をしている場合、あまり気にならない間違いではありますが。
そもそも「CPUが使えるメモリ空間」という概念が曖昧なのが、この問題をややこしくしている所以です。自分の言葉でこれを定義してみようとしてみてください。
(間)
模範解答としては、これは二つの意味がいりまじったもので、技術的に分けてみれば「CPUに接続できるメモリのメモリ空間」と「プログラムがアクセス可能なメモリ空間」ということになるのです。前者が物理メモリ空間、後者が仮想メモリ空間と思ってほぼまちがいないでしょう。
さらに噛み砕いていえば、1GBしかメモリを (物理的に) 搭載していないシステムでも、2GBのメモリを (論理的に) 使うアプリケーションを動かすことができます。でも (「普通」の 32bit CPU上の「普通の」 OSでは) 4GB以上のメモリを使うアプリケーションを動かすことはできません。これは直感的には明らかではないかもしれませんが、それが論理的なアドレス空間の制限というものです。
以上、参考になれば幸いです。
追記: i386って Segmentationがあっても、それを一度 32bitの論理アドレスにmapしてから、さらに 32bitの物理アドレスにするんじゃなかったっけ。つまり、参照した文書の「32bitのx86アーキテクチャは、48bitの論理メモリ空間を持ちます」は、技術的にも怪しい気がしてきました。瑣末な問題ですが。
丁寧にご説明ありがとうございます。
CPUのbit数はここで言うアドレスパスorアドレッシングできる数の、
どちらかと同義でしょうか??