.TSK с перекрытиями. Первый подход к снаряду
Ну, если говорить строго, до перекрытий в данном случая я ещё не добрался (но программа с перекрытиями), только начал раскручивать информацию о них (правое верхнее окно, там же пример автогенерации комментариев), но началась отработка показа листингов для таких программ. Пока на так называемой multi-user task.
Этот вариант поддерживается (ЕМНИП) только в M-Plus и основная мысль в их реализации - как можно сэкономить память. Секции с атрибутами RO и RW собираются в отдельные сегменты и сегмент RO как бы образует встроенную в .TSK dll библиотеку (в терминах RSX - Shared Library). Когда такая программа запускается в первый раз, операционка создаёт область памяти, в которую загружает RO сегмент, далее традиционным способом организуется задача (в Windows аналог - процесс) и часть её адресного пространства отображается на RO область (с защитой от записи). При втором и последующих запусках - область уже создана, так что нужно только создать задачу и отобразить на RO область - что позволяет ускорить запуск и сэкономить память. При этом, если завершены все экземпляры задач программы - RO область может остаться висет в памяти - если количество свободной памяти достаточно для запуска других программ (ускорение запуска нашей muliuser программы). Эта область может быть удалена из памяти - если памяти не хватает, а запущенных экземпляров multiuser программы нет, или "выгружена" - если они есть. Если планировщик выбирает multiuser задачу для выполнения, а любая её часть/части (включая RO область) выгружены - предварительно выгруженные части подгружаются. В данном случае "выгрузка" для RO части - на самом деле фикция - поскольку копия RO - при "выгрузке" она просто удаляется из памяти, а "загружена" она будет из файла программы.
Пример содержимого памяти с запущенной multiuser задачей:
...AT., ...PIP - RO сегментыКод:RSX-11M-PLUS V4.6 BL87 (KPXX01) 256K UP 000:00:00 2022-08-24 11:05:02 TASK= *IDLE* FREE= SY0:165840. P0:DMO VF1:1071. P1:DMO PARS POOL=4592.:4746.:15. SECPOOL=368.:512.:71% 4592.:4746.:15. 368.:512.:71% SECPOL:P SYSPAR:D IN: D M TR T PD MV DP . F F F DRVPAR:D 10 I C KC T UU UF WM . C 1 1 GEN :D 63K R R TT : C: :: :T . S 1 1 OUT: 1 . N. O . A R A A 0 1 . . M . T E C C 0K M . . . . S P P !========!===>]=]===)!)()=))>-----+---! <>---+ 0*******16******32******48******64******80******96******112***** E----P----P-------D---------------D----------D------------------ ---------------------------------------------------------------- 128*****144*****160*****176*****192*****208*****224*****240***** -->--+ !--->-->--->-><---->---> P . A Q S H L B R ERRSEQ I . C M Y R P A M 0. P . D G S C 0 P D T P 2 . L . 0 T 0 I 0 . O . 0 P . G .
PIPT0 - RW сегмент
Обработчки командых файлов ICP (задача ...AT.) в текущий момент не запущен - в памяти только RO сегмент, а ...PIP был запущен, так что виден RO сегмент (...PIP) и RW сегмент запущенной задачи (PIPT0)
- - - Добавлено - - -
Найдена (и поправлена) ошибка (на скриншоте DisAsm-а видна неправильно сформировавшаяся строка) и поправлен функционал "разрезания" строк. Поскольку была приличная переделка работы с памятью "загруженной" программы - большой этап тестирования, прежде чем двинусь с концепта дальше.
- - - Добавлено - - -
Подкорректированный вариант




Ответить с цитированием