12. UniPascal в деталях
73
До стартирования программы на UniPascal-е вся память с адреса $XXXX до SP
(указателя стека) была свободной и адреса $RRRR и $ZZZZ совпадали (т.е. не было
динамических переменных). Область памяти с адресами от $0100 до $XXXX занята
некоторой программой, которая активизировала программу на UniPascal-е. Обычно,
такой программы нет (т.е. программа на UniPascal-е выполняется без помощи другой
программы) и поэтому $XXXX = $0100.
Область памяти с адресами от $ZZZZ до $C000 занята резидентными или
системными программами. Обычно ее объем около 2-3 килобайта. Это значит, что
свободная память обычно размером около 45-46 килобайтов.
После активизации программы на UniPascal-е ее код (Y код) загружается в
область памяти с начальным адресом $XXXX. После того резервируется память для
глобальных переменных программы. Если она использует модули, эта операция
повторяется столько раз, сколько модулей у нее.
При активизации каждой процедуры резервируется место для ее локальных
переменных. После ее выполнения занятая область памяти для ее локальных
переменных освобождается. Параметры передаются процедуре при помощи
системного стека. Если процедура оверлейная, то кроме этой области (для локальных
переменных) резервируется место и для ее кода (который вводится с внешней памяти
- с дискета). После окончания работы процедуры освобождается и занятая ею область.
Память для динамических переменных резервируется и освобождается через
стандартные прерывания BIOS-а (int $2a и int $2b). Через BIOS легко реализуется
механизм освобождения памяти по методу MARK - RELEASE. Полученные в следствии
использования стандартной процедуры DISPOSE (FREEMEMWORDS) дыри
обрабатываются отдельно. Они организуются в связанном списке. Попытка
предоставления памяти удовлетворяется найменьшей подходящей дырой. Если такой
нет, отправляется запрос к BIOS-у. При освобождении памяти через DISPOSE/FREE-
MEMWORDS в динамической памяти появляется дыра. Освобождаемая дыра
объединяется с соседней ей, если у нее есть сосед. Если дыра занимает верх
динамической памяти, она освобождается через BIOS. Таким образом реализованные
оба метода для освобождения памяти (DISPOSE/FREEMEMWORDS и MARK-RELEASE)
могут быть использованы совместно. Процедуру MARK можно использовать только до
наступления фрагментации динамической памяти. В таком случае применение RELEASE
восстановит состояние динамической памяти в состояние, которое было до применения
процедуры MARK.
Область свободной памяти находиться между указателем стека (SP) и концом
локальных переменных ($PPPP). При предоставлении памяти для динамических
переменных указатель стека идет сверху внизь, а при активизации процедуры адрес
$PPPP увеличивается. Если они встретятся, т.е. если SP <= $PPPP, возникает ошибка -
переполнение памяти.
Использование нулевой страницы
Нулевая страница микрокомпьютера Пылдин 601/601А/601М представляет
собою та часть оперативной памяти, старший байт которой содержить $00, т.е. от $0000
до $00FF. Область этой страницы от $0000 до $007F резервирована для UniDOS-а и
UniBIOS-а. Область от $0080 до $00DF используеться интерпретатором. Область с
$00E0 до $00FF не используется интерпретатором. Пространство от $00B0..$00DF
используется интерпретатором в качестве рабочей области. Ассемблерские
подпрограммы тоже могут использовать эту область памяти как рабочая. Но нужно
иметь ввиду, что интерпретатор тоже пользуется ею.
<<  <  GO  >  >>

Вернуться к началу сайта