Модуль «System». Константы. Переменные. Стандартные процедуры и функции, страница 3

                           ¦............................¦        ¦
                           ¦   кодовый сегмент          ¦        ¦
                           ¦    первого модуля          ¦        ¦
                           ¦............................¦        ¦
                           L-----------------------------    содержимое
                           .   кодовый сегмент          .      образа
                           .   других   модулей         .    файла .EXE
                           -----------------------------        ¦
                           ¦............................¦        ¦
                           ¦   кодовый сегмент          ¦        ¦
                           ¦ последнего  модуля         ¦        ¦
                           +----------------------------+        ¦
                           ¦   кодовый сегмент          ¦        ¦
                           ¦  главной программы         ¦        ¦
                           +----------------------------+<--------
                           ¦ префикс сегмента программы ¦
                           ¦        (PSP)               ¦
              PrefixSeg -->L-----------------------------
             Рис. 1 Схема памяти для программы реального режима DOS.
 
        Сегмент данных  (адресуемый  через  регистр DS) содержит все типизированные константы,  за которыми следуют все глобальные переменные.  В  процессе выполнения программы регистр DS никогда не изменяется. Размер сегмента данных не может превышать 64К.
        При входе в программу регистр сегмента стека (SS)  и  указатель стека (SР) загружаются так,  что пара регистров SS:SР указывает на первый байт,  следующий за сегментом стека.  Регистр SS в процессе  выполнения программы никогда не изменяется,  а SP может перемещаться вниз,  пока не достигнет  нижней  границы  сегмента. Размер сегмента стека не может превышать 64К. По умолчанию ему назначается размер, равный 16К, но с помощью директивы компилятора $М это значение можно изменить.
        Оверлейный буфер  используется  стандартным  модулем Overlay для хранения оверлейного кода.  По умолчанию  размер  оверлейного буфера соответствует размеру наибольшего оверлея в программе. Если программа не имеет оверлеев,  то размер оверлейного буфера будет нулевым.  Размер оверлейного буфера можно увеличить с помощью вызова подпрограммы OvrSetBuf модуля Overlay.  В этом случае размер динамически   распределяемой  области  памяти  соответственно уменьшается, а HeapOrg перемещается вверх.
        В динамически распределяемой области сохраняются  динамические переменные,  то есть переменные,  выделенные при обращениях к стандартным процедурам New и GetMem. Она занимает всю  свободную память  или  часть  свободной  памяти,  оставшуюся при выполнении программы. Действительный размер динамически распределяемой  области  зависит от максимального и минимального значений, которые можно установить для динамически распределяемой области с помощью директивы компилятора $М. Гарантированный минимальный размер динамически распределяемой области не может быть меньше минимального значения, установленного для этой области. По умолчанию минимальные размер динамически распределяемой области равен 0 байт, а максимальный - 640К; это означает, что по умолчанию динамически распределяемая область занимает всю доступную память.
        Подсистема динамического  распределения  памяти  (являющаяся частью библиотеки исполняющей системы), как можно догадаться, управляет динамически распределяемой областью.

Администратор динамически распределяемой области памяти DOS.

        Динамически распределяемая область - это  похожая  на  стек структура,  которая увеличивается, начиная от младших адресов памяти. При  этом  используется  сегмент динамически распределяемой области. Нижняя граница динамически распределяемой области  запоминается  в  переменной  HеаpOrg,  а  верхняя граница динамически распределяемой области соответствует нижней границе свободной памяти и сохраняется в переменной НеаpPtr. При каждом выделении динамической переменной в динамически распределяемой  области  подсистема динамического распределения памяти (администратор динамически распределяемой области) перемещает переменную HeapPtr вверх на размер переменной, как бы организуя при этом стек динамических переменных, в котором одна переменная размещается над другой.