Важная информация

User Tag List

Страница 1 из 7 12345 ... ПоследняяПоследняя
Показано с 1 по 10 из 67

Тема: Перемещаемость на лету

  1. #1
    Guru
    Регистрация
    03.01.2006
    Адрес
    Рязань
    Сообщений
    2,935
    Благодарностей: 1071
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Перемещаемость на лету

    Придумайте, как писать программу так, чтобы она могла быть в любой момент прервана (INT) и перемещена в памяти (возможно, с пересчётом каких-то ячеек по какому-то списку, возможно, динамически генерируемому). Так что при возврате указатели на переменные или массивы устаревают. И стек вызовов тоже. Допустим, перемещение производится по 256 или кратное число байт.

    Мне пока видятся только следующие методы:

    1) Типизация стека и регистров. В стек каждый раз пишется не 2 байта, а 4 (данные и тип - число/указатель). Области смены типа регистров, а также EXX'ы обрамляются системными вызовами.

    2) Чтение данных по указателям - только через системные вызовы (очень медленно!). В указателях только смещения относительно начала блока программы. CALL и RET - через системные макросы (тоже по смещению, и в стеке лежит смещение точки возврата).

    3) CALL и RET - через системные макросы (в стеке лежит смещение точки возврата). Типы регистров никогда не меняются.
    Если указатели - HL и DE, то проблема с 16-битной арифметикой.
    Если указатели - IX и IY, то всё медленно.
    Если только один указатель и буферизация данных в стеке, то ещё медленнее и вообще изврат.
    Компромисс - IX и DE (или DE и DE').

    4) Интерпретируемый язык (очень медленно!).

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,031
    Благодарностей: 1426
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Если код еще можно перемещать, но интерпретация произвольного 16-битного (или даже 8-битного) значения в регистре как изменяемого адреса - это утопия.

    Компромиссный вариант- захват ресурсов через системные вызовы. На время захвата гарантируется неперемещаемость ресурса.

  4. Этот пользователь поблагодарил Vitamin за это полезное сообщение:
    alone (21.03.2012)

  5. #3
    Guru Аватар для jerri
    Регистрация
    01.03.2005
    Адрес
    Samara
    Сообщений
    3,363
    Благодарностей: 704
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Ересь
    одна команда LDIR убьет данные
    если делать перемещение
    ld hl,data1
    ld de,data2
    ld bc,size
    call data_move - то тут я даже не могу предположить как надо извращаться что бы передать 1 байт и не попасть под INT и какую скорость это даст

    я бы предложил написать трассировщик и больше не задумывался
    С уважением,
    Jerri / Red Triangle.
    [02.05.2014] не забудь этот день. Чубайс должен умереть. Dixi.
    [l'Abbey des morts TSEvo EV...5%] kiwi кошелек +79178162712

  6. #4
    Guru
    Регистрация
    03.01.2006
    Адрес
    Рязань
    Сообщений
    2,935
    Благодарностей: 1071
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Критические секции сделать легко. Идея мне нравится. А какие есть идеи по конкретной реализации CALL-RET?

  7. #5
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,031
    Благодарностей: 1426
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от alone Посмотреть сообщение
    А какие есть идеи по конкретной реализации CALL-RET?
    Подфункции? Каждый процесс (я правильно тебя понимаю?) может содержать таблицу патчей для таких целей.

    Да, чтоб упростить себе жизнь, процессор объявляется таким же ресурсом, как и память. Т.е. кодовый сегмент процесса может перемещаться только после того, как он (процесс) явно вызвал sleep/wait/yield.

  8. #6
    Guru
    Регистрация
    03.01.2006
    Адрес
    Рязань
    Сообщений
    2,935
    Благодарностей: 1071
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vitamin Посмотреть сообщение
    Цитата:





    Сообщение от alone


    А какие есть идеи по конкретной реализации CALL-RET?




    Подфункции? Каждый процесс (я правильно тебя понимаю?) может содержать таблицу патчей для таких целей.
    Нельзя использовать команду CALL, потому что она кладёт в стек абсолютный адрес.

    Цитата Сообщение от Vitamin Посмотреть сообщение
    Т.е. кодовый сегмент процесса может перемещаться только после того, как он (процесс) явно вызвал sleep/wait/yield.
    Чревато повисаниями всей системы.

    ---------- Post added at 16:19 ---------- Previous post was at 16:15 ----------

    Поставим вопрос по-другому: можно ли реализовать относительный вызов без критической секции? Если нет, то как это доказать?

  9. #7
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,031
    Благодарностей: 1426
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от alone Посмотреть сообщение
    Нельзя использовать команду CALL, потому что она кладёт в стек абсолютный адрес.
    Код:
    ld hl,subroutine
    call Invoke ;system call
    Цитата Сообщение от alone Посмотреть сообщение
    Чревато повисаниями всей системы.
    С чего это?

  10. #8
    Guru
    Регистрация
    03.01.2006
    Адрес
    Рязань
    Сообщений
    2,935
    Благодарностей: 1071
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vitamin Посмотреть сообщение
    ld hl,subroutine
    call Invoke ;system call
    И тут между call и первой командой системного вызова внезапно прерывание. Твои действия?

    Цитата Сообщение от Vitamin Посмотреть сообщение
    С чего это?
    Глюки программистов неистребимы. Особенно с таймингами.

  11. #9
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,031
    Благодарностей: 1426
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от alone Посмотреть сообщение
    И тут между call и первой командой системного вызова внезапно прерывание. Твои действия?
    Вы находитесь в закрытой комнате без окон и дверей и вам нужно выбраться. Ваши действия?

    Зачем себе ставить заведомо сложные условия чтоб потом биться о них головой и с криком "ура" преодолевать? Разумные ограничения и инварианты- путь к свободе принятия решений, как это ни парадоксально.

    Цитата Сообщение от alone Посмотреть сообщение
    Глюки программистов неистребимы. Особенно с таймингами.
    Глюки таймингов- это самые безобидные из глюков, которые могут быть. Запись не по тому адресу не может быть отловлена и будет иметь гораздо более плачевные последствия.
    К тому же, есть прерывания, на которых может висеть не только шедулер, но и монитор дедлоков.

  12. #10
    Guru
    Регистрация
    03.01.2006
    Адрес
    Рязань
    Сообщений
    2,935
    Благодарностей: 1071
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vitamin Посмотреть сообщение
    Зачем себе ставить заведомо сложные условия чтоб потом биться о них головой и с криком "ура" преодолевать?
    Это условие обусловлено архитектурой 128K.

Страница 1 из 7 12345 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •