PDA

Просмотр полной версии : Использование overlay



bigral
27.01.2022, 08:35
как я понимаю для pdp11 систем оверлеи это чтото совсем обыденное если прога длинной и сложностью примерно как редактор vi

ктото может наглядно показать как это использовать?

на скоко я понимаю есть всегда невыгружаемая часть в которой код переключения оверлеев и буфер обмена данными между функциями в оверлеях, ну и сами оверлеи в которых функции и приватные данные с которыми эти функции работают

AFZ
28.01.2022, 06:38
на скоко я понимаю есть всегда невыгружаемая часть в которой код переключения оверлеев и буфер обмена данными между функциями в оверлеях, ну и сами оверлеи в которых функции и приватные данные с которыми эти функции работаютГде-то так и есть,причем все это организует LINK в процессе сборки, при программировании надо просто учитывать, что не вся программа будет в памяти. Допустим, не пихать в короткий цикл последовательность команд, требующих перезагрузки оверлеев...

Еще в ХМ-версии есть т.наз. оверлеи в верхней памяти, когда оверлейная программа грузится целиком (в верхнюю память), а переключение оверлеев делается через диспетчер памяти.

А вот с примером хуже - когда-то я делал такой пример, но где он - понятия не имею...

Alex
31.01.2022, 08:58
Оверлеи в верхней памяти для пользователя делаются почти прозрачно заменой ключа при компоновке с /O: на /V:
Имеется правда несколько тонкостей :)
Всё работает с фортраном в RT11XM во всяком случае. За счёт расположения в памяти модулей программы работает быстрее и меньше нагрузка на диск.
Буфер обмена данными делаешь сам. Либо как аргументы функций или(и) подпрограмм(классика) либо через блоки COMMON в нижележащих оверлейных модулях. Возможны ещё варианты разумеется ;) С другими языками программирования не пробовал, так как нужды не было...

vva
02.02.2022, 23:17
Именно так, как написал Alex: общие блоки в Фортране и Макро, раскидываешь подпрограммы по непересекающимся группам, link и все работает. Старые распечатки практически стерты, примера, увы, не приведу.

form
05.02.2022, 11:41
Все просто.
На примере RT-11, каждый оверлей выделяется в одельный модуль, а при линковке указывается какие модули к какому сегменту относятся:
R LINK
PROG=PROG//
MOD1/O:1
MOD2/O:1
MOD3/O:2
MOD4/O:2
//
Аргумент /O обозначает номер сегмента, модули с одинаковым сегментом будут перекрываться.
Для виртуальных модулей в расширенной памяти вместо /O нужно использовать /V (при этом надо учитывать что адреса сегментов будут выравниваться на границу 20000).
В самой программе специально ничего делать не нужно (кроме понимания механизма работы).
Вызовы подпрограмм из оверлейных сегментов будут заменены на вызовы подпрограмм переадресации.