Сегмент локальных динамических данных
Каждая прикладная программа или библиотека имеет один сег- мент данных, который называется сегментом локальных динамических данных и может занимать до 64К. На сегмент локальных динамических данных всегда указывает регистр сегмента данных DS. Он разделен на четыре части:
Сегмент локальных динамических данных ------------------------------------ ¦ ¦ ¦ Локальная динамически распределя- ¦ ¦ емая область памяти ¦ ¦ ¦ +-----------------------------------+ ¦ ¦ ¦ Стек ¦ ¦ ¦ +-----------------------------------+ ¦ ¦ ¦ Статические данные ¦ ¦ ¦ +-----------------------------------+ ¦ ¦ ¦ Заголовок задачи ¦ ¦ ¦ L------------------------------------
Рис. 21.7 Сегмент локальных динамических данных.
Первый 16 байт сегмента локальных динамических данных всегда содержат заголовок задачи, в котором Windows сохраняет различную системную информацию.
Область статических данных содержит все глобальные перемен- ные и типизированные константы, описанные в прикладной программе или библиотеке.
Сегмент стека используется для хранения локальных перемен- ных, распределяемых процедурами и функциями. На входе в приклад- ную программу регистр сегмента стека SS и указатель стека SP заг- ружаются таким образом, что SS:SP указывает на первый байт после области стека в сегменте локальных динамических данных. При вызо- ве процедур и функций SP перемещается вниз, выделяя память для параметров, адреса возврата и локальных переменных. Когда подп- рограмма возвращает управление, процесс изменяется на обратный: SP увеличивается и принимает то значение, которое было перед вы- зовом. Используемый по умолчанию размер области стека в автомати- ческом сегменте данных равен 8К, но с помощью директивы компиля- тора $M это значение можно изменить.
В отличие от прикладной программы библиотека в сегменте ло- кальных динамических данных не имеет области стека. При вызове в динамически компонуемой библиотеке DLL процедуры или функции ре- гистр DS указывает на сегмент локальных динамических данных биб- лиотеки, но пара регистров SS:SP не изменяется. Таким образом, библиотека всегда использует стек вызывающей прикладной програм- мы.
Последняя часть в сегменте локальных динамических данных - локальная динамически распределяемая область. Она содержит все локальные динамические данные, которые распределялись с помощью функции LocalAlloc в Windows. По умолчанию локальная динамически распределяемая область имеет размер 8К, но это значение можно из- менить с помощью директивы компилятора $M.
Windows допускает, чтобы сегмент локальных динамических дан- ных был перемещаемым, но Borland Pascal этого не поддерживает. Сегмент локальных динамических данных прикладной программы или библиотеки Borland Pascal всегда блокируется, этим обеспечивает- ся, что селектор (адрес сегмента) сегмента локальных динамических данных никогда не изменяется. При работе в стандартном или расши- ренном режиме это не приводит ни к какому ухудшению, поскольку сегмент сохраняет тот же селектор даже при перемещении в физичес- кой памяти. Однако в реальном режиме, если требуется расширение локальной динамически распределяемой области, Windows, возможно, не сможет этого сделать, поскольку сегмент локальных динамических данных перемещаться не может. Если ваша прикладная программа ис- пользует локальную динамически распределяемую область памяти и должна выполняться в реальном режиме, то следует обеспечить, что- бы начальный размер локальной динамически распределяемой области был таким, чтобы он удовлетворял всем потребностям в распределе- нии локальной динамической области (для этого используется дирек- тива компилятора $M).