Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BorlandPascal.doc
Скачиваний:
54
Добавлен:
17.03.2015
Размер:
2.83 Mб
Скачать

Использование памяти в программах dos защищенного режима

В данном разделе поясняется использование память в програм-

мах Borland Pascal для защищенного режима.

Сегменты кода

Прикладная программа и каждая библиотека в прикладной прог-

рамме или DLL имеет свой собственный сегмент кода. По умолчанию

модули с аналогичными атрибутами группируются в сегментах кода.

Вы можете управлять таким группированием с помощью директив $S и

$G имя_модуля. Размер одного сегмента кода не может превышать

64К, но общий размер кода ограничен только объемом доступной па-

мяти.

Атрибуты сегмента

Каждый сегмент кода имеет набор атрибутов, определяющих по-

ведение сегмента кода при загрузке в память.

Атрибуты moveable или fixed

Когда сегмент кода имеет атрибут MOVEABLE (перемещаемый),

администратор памяти может перемещать сегмент в физической памя-

ти, чтобы удовлетворить другие запросы распределения памяти. Ког-

да сегмент кода имеет атрибут FIXED (фиксированный), он ни при

каких обстоятельствах не перемещается в физической памяти. Пред-

почтительным атрибутом является MOVEABLE, и пока не будет абсо-

лютно необходимо хранить сегмента в одних и тех же адресах памяти

(это имеет место, например, для обработчика прерываний), следует

использовать этот атрибут. Когда вам потребуется фиксированный

сегмент кода, такой сегмент кода следует сделать по возможности

маленьким.

Атрибуты preload или demandload

Сегмент кода, имеющий атрибут PRELOAD (предварительно загру-

жаемый), автоматически загружается при активизации прикладной

программы или библиотеки. Атрибут DEMANDLOAD (загружаемый по зап-

росу) откладывает загрузку сегмента или программы до фактического

вызова сегмента. Хотя это требует больше времени, но позволяет

прикладной программе экономить память.

Атрибуты discardable или permament

Когда сегмент имеет атрибут DIASCARDABLE (выгружаемый), ад-

министратор памяти защищенного режима может освободить занимаемую

сегментом память, когда требуется дополнительная память. Когда

сегмент имеет атрибут PERMANENT (постоянный), он все время хра-

нится в памяти. Когда прикладная программа вызывает сегмент

DISCARDABLE, отсутствующий в памяти, администратор защищенного

режима сначала загружает его из файла .EXE. Это требует больше

времени, чем если бы сегмент имел атрибут PERMANENT, но позволяет

выполнять прикладную программу в меньшем объеме памяти.

Сегмент DISCARDABLE в программе DOS защищенного режима ана-

логичен оверлейному сегменту в программе DOS, в то время как сег-

мент PERMANENT в защищенном режиме DOS аналогичен сегменту прог-

раммы DOS, не являющемуся оверлейным.

Сегменты данных и стека

Каждая прикладная программа защищенного режима DOS или биб-

лиотека содержит сегмент данных, которые может иметь размер до

64К. На сегмент всегда указывает регистр сегмента данных (DS).

Этот сегмент содержит типизированные константы и глобальные пере-

менные.

Кроме сегмента данных, прикладная программа защищенного ре-

жима DOS имеет сегмент стека, который используется для хранения

локальных переменных, распределенных процедурами и функциями. На

входе в прикладную программу регистр сегмента стека (SS) и указа-

тель стека (SP) загружены таким образом, что пара регистров SS:SP

указывает на первый байт после сегмента стека. Когда вызываются

процедуры и функции, SP для выделения пространства для парамет-

ров, адреса возврата и локальных переменных перемещается вниз.

Когда подпрограмма возвращает управление, процесс изменяется на

обратный: указатель стека увеличивается до значения, которое он

имел перед вызовом. По умолчанию размер сегмента стека равен 16К,

но с помощью директивы компилятора $M его можно изменить.

В отличие от прикладной программы, DDL DOS защищенного режи-

ма не имеет сегмента стека. Когда в DLL вызывается процедура или

функция, регистр DS изменяется, чтобы указывать на сегмент данных

DLL, но пара регистров SS:SP не модифицируется. Таким образом,

DLL всегда использует сегмент стека вызывающей прикладной прог-

раммы.

Соседние файлы в предмете Программирование на Pascal