0

使用可能なメモリ セグメントに関する C のテキストを読んでいます。テキストには、最も高い 2 つのセグメントがヒープとスタックであり、互いに向かって成長することが示されています。

Segments:
 ________
|Text (Machine code)
|________
|Data
|________
|BSS
|________
|Heap   (grows towards stack)
|
|
|Stack  (grows towards heap) 
|________

下位 4 つのセグメントで作成された変数のメモリ位置を出力する簡単なプログラムを作成すると、次の結果が得られます。

initialized in  | Hex Address | Decimal Value
Data        - 0x080497ec    134,518,764
BSS         - 0x080497f8    134,518,776
Heap        - 0x0804a008    134,520,840
Stack       - 0xbffff844    3,221,223,524

ヒープとスタックがそれらの間で共有するのに〜30億バイトあるという解釈ですか? 私が作業しているコンピューターには 1 GB のメモリしかないため、この解釈の正確性には疑問があります。

4

1 に答える 1

3

そこには 3GB のアドレス空間がありますが、マップする必要があるという意味ではありません (ほとんどの場合、マップされていません)。それは単なるスペースです。オペレーティング システムは、プログラムが要求したときに物理メモリをそのスペースにマップする必要があります。

あなたが読んだこの種のメモリモデルはかなり時代遅れです。最新のオペレーティング システムのメモリ レイアウトははるかに複雑で、ヒープが直線的に増加する必要はなく、スタックが他のすべての下に配置されることもあり、テキストとデータが必ずしも隣り合っている必要はありません。共有ライブラリ、アドレス空間レイアウトのランダム化を追加すると、非常にファンキーになります。

于 2013-03-28T12:23:50.550 に答える