Просмотр полной версии : Использование overlay
как я понимаю для pdp11 систем оверлеи это чтото совсем обыденное если прога длинной и сложностью примерно как редактор vi
ктото может наглядно показать как это использовать?
на скоко я понимаю есть всегда невыгружаемая часть в которой код переключения оверлеев и буфер обмена данными между функциями в оверлеях, ну и сами оверлеи в которых функции и приватные данные с которыми эти функции работают
на скоко я понимаю есть всегда невыгружаемая часть в которой код переключения оверлеев и буфер обмена данными между функциями в оверлеях, ну и сами оверлеи в которых функции и приватные данные с которыми эти функции работаютГде-то так и есть,причем все это организует LINK в процессе сборки, при программировании надо просто учитывать, что не вся программа будет в памяти. Допустим, не пихать в короткий цикл последовательность команд, требующих перезагрузки оверлеев...
Еще в ХМ-версии есть т.наз. оверлеи в верхней памяти, когда оверлейная программа грузится целиком (в верхнюю память), а переключение оверлеев делается через диспетчер памяти.
А вот с примером хуже - когда-то я делал такой пример, но где он - понятия не имею...
Оверлеи в верхней памяти для пользователя делаются почти прозрачно заменой ключа при компоновке с /O: на /V:
Имеется правда несколько тонкостей :)
Всё работает с фортраном в RT11XM во всяком случае. За счёт расположения в памяти модулей программы работает быстрее и меньше нагрузка на диск.
Буфер обмена данными делаешь сам. Либо как аргументы функций или(и) подпрограмм(классика) либо через блоки COMMON в нижележащих оверлейных модулях. Возможны ещё варианты разумеется ;) С другими языками программирования не пробовал, так как нужды не было...
Именно так, как написал Alex: общие блоки в Фортране и Макро, раскидываешь подпрограммы по непересекающимся группам, link и все работает. Старые распечатки практически стерты, примера, увы, не приведу.
Все просто.
На примере RT-11, каждый оверлей выделяется в одельный модуль, а при линковке указывается какие модули к какому сегменту относятся:
R LINK
PROG=PROG//
MOD1/O:1
MOD2/O:1
MOD3/O:2
MOD4/O:2
//
Аргумент /O обозначает номер сегмента, модули с одинаковым сегментом будут перекрываться.
Для виртуальных модулей в расширенной памяти вместо /O нужно использовать /V (при этом надо учитывать что адреса сегментов будут выравниваться на границу 20000).
В самой программе специально ничего делать не нужно (кроме понимания механизма работы).
Вызовы подпрограмм из оверлейных сегментов будут заменены на вызовы подпрограмм переадресации.
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot