2016-03-22 19 views
3

私のシステムのcpuinfoファイルによると、私のシステムの各プロセッサは39ビットの物理アドレスサイズと48ビットの仮想アドレスサイズを持っています。ポインタと仮想メモリ

私のシステムは16GBのRAMを持っているので、39ビットの物理アドレスのサイズは39ビットが16GBのRAMをアドレス指定するのに十分であるため、私には意味があります。

しかし、48ビットの仮想アドレスサイズは私を混乱させます。私はいつも、ソースコードの観点から2^64バイトの仮想メモリをアドレス指定できるCプログラムを書くことができると信じていました(システム上のポインタはサイズ(void *)に応じて8バイト長です)。しかし、cpuinfoは2^48バイトの仮想メモリしか持っていないことを教えています。それで私のCプログラムは2^48バイトの仮想メモリだけを扱うことができますか?

+0

まだ望ましい、そう...? –

+0

私はcpuinfoの仮想アドレスのサイズと私のシステムが "名目上" 64ビットであることを知りたがっています。 – josh

+0

高水準言語の使用法の1つは(たとえCが低水準でかなり低いにもかかわらず)、ハードウェアを抽象化することです。 Cではポインタがあります。それは "メモリ"を指しています。それは本当にあなたが知る必要があるすべてです。 –

答えて

6

64ビットシステムでは、実際にポインタは64ビット幅です。つまり、2つのポインタの可能な値はです。

ただし、current x86-64 (AMD64) implementationsは、下位48ビットのみを使用します。これは、実際には有効なポインタと、常に無効なポインタが非常に多いことを意味します。2

AMD64 Architecture Programmer’s Manual Volume 2: System Programming

状態:

現在、AMD64アーキテクチャは、52-ビットの物理アドレスに48ビットの仮想アドレスを変換するための機構を定義します。完全な64ビット仮想アドレスを変換するために使用されるメカニズムは予約されており、将来のAMD64アーキテクチャ仕様で説明されています。

+0

48ビットの範囲外にあるメモリに対処しようとすると、segfaultが発生することが疑われました(しかし、このsegfaultは他のイベントがトリガできるように48ビットの問題によって引き起こされたとは確信できません)。私が疑ったものを確認していただきありがとうございます。 – josh

+0

実際には、使用されているビット幅( 'sizeof(type)* CHAR_BIT')のすべてのビットを使用するためには、ビルトイン変数は必要ありません。 – Olaf

+3

@joshもしあなたがアセンブラコードの作成を開始したり、ポインタのためにハードコードされたアドレスを使用したり、初期化されていないポインタ変数を使うのでなければ、あなたは決して不正なアドレスを取得することはありません。あなたは違法な住所です。 –

2

マシンレジストリの拡張のために、より速くより強力な実行のために新しいCPUが開発されました。これは通常機械語と呼ばれています。
4ビット(4004)から8,16,32,64から128ビット(アルファ)までの初期のCPUで開始され、将来的にはより多くの内部データレジスタが増加します。
標準プロセッサは、汎用コンピューティングとして定義されているほど普及しているように、命令ポインタレジスタのサイズ等価性、したがってアドレッシング範囲を機械自然語と主な特徴の1つとしています。したがって、64ビットのCPUではIPアドレスと同様にメモリアドレスが64ビットに拡張されます。
しかし、64ビットのアドレス指定は、実際には18.446.744.073.709.551.616バイト(16.777.216Tバイト)までの大きなアドレス範囲です。現在の技術では単純に実現不可能なことです。このため、彼らは実際のアドレス指定を1Tバイト(2^40)に制限することに決めました。この選択により、CPUの複雑さと消費電力が削減されました。
MMUレジスタ(メモリ管理ユニットレジスタ)とページディレクトリに使用されるメモリを制限して、仮想メモリを256Tバイト(2^48)に制限することを決めました。
メモリアドレッシングラインを拡張することは、メモリアドレスデコードでさえより複雑になり、より多くのロジックゲートを必要とし、その結果、より多くの電力を必要とし、デコードタイミングを遅くし、メモリアクセスサイクルを遅らせることを考慮する。
実際のシステムでは、最後の16ビットが設定された仮想または物理アドレスごとにメモリアクセス例外がトリガされます。結論64-ビットで
は、一般的な計算の上で有益であるが、対処する上で有効ではないですが、memory pointer size = machine natural integer sizeすることができますあなたが抱えている問題は何

関連する問題