Как уже ранее отмечалось, максимальный размер модуля не может превышать 64 Кбайт, однако количество модулей в программе не ограничивается. Это дает возможность создавать программы, занимающие весь доступный объем оперативной памяти ПЭВМ. В ряде случаев для больших программ этого объема также недостаточно. Тогда программист может использовать механизм оверлеев, позволяющий создавать программы практически неограниченного объема.
Оверлеи представляют собой части программы, которые размещаются в отдельном файле дисковой памяти и в процессе работы программы совместно используют общую область оперативной памяти. В один и тот же момент времени в памяти размещается одна или несколько оверлейных частей программы, а в процессе ее выполнения происходит смена оверлеев. Оверлейные части Паскаль-программы оформляются как отдельные модули.
Предположим, что программа состоит из основной части Main и трех модулей A, B и С, при этом их объем составляет соответственно и . Без использования оверлеев для размещения программы требуется байт. Структура такой программы имеет следующий вид:
M a i n
A
B
C
С использованием оверлеев получим такую структуру:
Для размещения такой программы требуется байт памяти.
В многомодульной программе содержится основная программа (Program), резидентные (неоверлейные) и оверлейные модули. При компиляции такой программы создаются два файла: исполнимый файл с расширением exe и оверлейный с расширением ovr. При загрузке оверлеев в память они размещаются в оверлейном буфере, расположенном между сегментом стека и динамически распределяемой областью памяти. Размер этого буфера по умолчанию принимается равным размеру наибольшего оверлейного модуля.
Управление оверлеями реализуется в Турбо Паскале с помощью стандартного модуля Overlay. При этом в программе пользователя должны быть выполнены следующие требования.
1. Все оверлейные модули должны компилироваться с директивами {$O+, F+}.
Директива {$O+, F+} означает, что данный модуль может быть использован как оверлейный. В связи с этим в программе, имеющей оверлейную структуру, обычно для всех модулей устанавливают такую директиву.
2. В основной программе после предложения Uses следует в директивах {$O Имя_файла} перечислить имена оверлейных модулей.
3. В основной программе в предложении Usesимя стандартного модуля Overlay должно быть первым.
в которой указывается имя файла с расширением ovr.
Код результата инициализации сохраняется в предописанной переменной OvrResult, которая при успешном завершении работы процедуры OvrInit принимает значение 0.
С помощью функции
OvrGetBuf : longint
можно получить значение размера оверлейного буфера (в байтах).