2013-03-28 3 views
0

Я читаю текст на C о сегментах памяти, доступных для использования. В тексте говорится, что два самых высоких сегмента - это куча и стек, которые растут друг к другу.GDB: как вы измеряете пространство памяти между кучей и стеком?

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

Создание простой программы для печати из ячеек памяти переменных, созданных в четырех нижних сегментов приводит к следующему:

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 

ли интерпретация, что куча и стек имеют ~ 3 млрд байтов для обмена между ними? Компьютер, на котором я работаю, имеет только 1 ГБ памяти, что заставляет меня сомневаться в точности этой интерпретации.

+1

Это один гигабайт реальной физической памяти или один гигабайт общей _virtual_ памяти? –

+1

Какой текст? Макет стека против кучи в виртуальном пространстве процесса * очень * зависит от системы. Разумеется, размер виртуального адресного пространства тоже мало значит. – unwind

+0

Ах, виртуальное адресное пространство и физическое адресное пространство. Не знал о различии. Благодарю. – Nate

ответ

3

Существует 3 ГБ адресного пространства, это не значит, что оно должно отображаться (скорее всего, это не так). Это просто пространство, операционная система по-прежнему должна отображать физическую память в это пространство, когда программа запрашивает ее.

Эта модель памяти, о которой вы читаете, довольно устарела. Современные операционные системы имеют гораздо более сложные макеты памяти, куча не должна расти линейно, стеки иногда располагаются ниже всего остального, а текст и данные необязательно должны быть рядом друг с другом. Добавить в разделяемые библиотеки, рандомизацию размещения в адресном пространстве, и все становится очень напуганным.

Смежные вопросы