Ты на вопрос не ответил: как часто нужно перемещение запущенного кода? Нужно ли это вообще или это из категории просто хороших хотелок?
Вид для печати
Ты на вопрос не ответил: как часто нужно перемещение запущенного кода? Нужно ли это вообще или это из категории просто хороших хотелок?
Нужно после удаления или десвопа задач. Без этого сама идея батников отправляется в помойку.
а нельзя сделать компромисс? скажем, правилом хорошего тона будет в главном цикле периодически вызывать спец. системную функцию, в которой может произойти перемещение кода. т.о., мы всегда будем знать, что сейчас перемещать безопасно, стек пуст, регистры не содержат нужной информации.
Это будет не правило хорошего тона, а ограничение при написании программ. Я предлагаю рассматривать только те варианты, которые можно реализовать автоматически в компиляторе.
А если упростить задание, абстрагироваться от zx-128 и представить себе любой виртуальный процессор который нужен. Возможно ли вообще сделать код и данные перемещаемыми на лету? Что для этого нужно от процессора?
Чтобы насрать мимо своей памяти, надо сильно постараться.
Не просто отдавать, а не реже, чем раз во фрейм. Для этого надо тоже сильно постараться, если программа представляет из себя нечто большее, чем окошко с кнопкой. Программа печатает текст. За фрейм не успеет - значит, надо вызывать систему каждую строку. Стоп! А вдруг строка больше 1000 символов? Значит, каждый символ. Стоп! А вдруг символ во весь экран? Значит, каждую линию символа.
---------- Post added at 12:00 ---------- Previous post was at 11:57 ----------
Сегменты или индексная адресация во всех командах, включая CALL и RET.
Прерывания тут причем? Речь шла о "добровольном" сохранении адресов в заранее известное системе место и последующей передаче управления системе с тем чтобы система смогла произвести перемещение модуля и произвести коррекцию адресов в модуле.
Я пересмотрел старые сообщения в теме и пришел к выводу что для перемещения процесса на лету нужно:
1. иметь отдельно стек адресов и стек данных (чтобы при перемещении знать что корекции подлежит только содержимое стека адресов);
2. иметь сведения о группе регистров используемых ТОЛЬКО для хранения адресов, т.е. должен быть системный вызов который мог бы добавить\убрать регистры из этой группы;
3. иметь карту памяти процесса в которую должны входить:
- все выделенные области памяти (те которые были выделенны при загрузке и те которые полученны от системы позже в процессе работы);
- адреса используемые процессом (включая адресса используемые для CALL\JP, адреса указывающие на сегменты данных (.data .bss) а так же адреса хранящиеся в выделенной в процессе работы памяти и тоже указывающие на сегменты данных (.data .bss) или возможно использующиеся для CALL\JP);
Кроме того, сама по себе "перемещаемость на лету" только НЕМНОГО поможет решить проблемы возникшие в результате ограничений накладываемых битностью логических адресов (16/24/32/64). Т.е. в принципе "перемещаемость на лету" обеспечит возможность SWAP-a и\или виртуальной памяти, но НЕ расширит прямоадресуемое пространство, поэтому для операции SWAP-a нужно будет пересылать немалые обьемы и терять на этом скорость, ну и кроме того процесс который физически не влазит в логическое адресное пространство всеравно не сможет быть запущен на такой системе.
Так что интереснее рассмотреть вопрос: "Как запустить процесс требующий памяти больше чем логически адресуемое пространство?"
bigral, а если я обращаюсь к какимто данным?
я могу на стеке (даже стеке данных) хранить как ссылки на информацию так и счетчики