masterspammer (masterspammer) wrote,
masterspammer
masterspammer

Сэкономил целый порт

К всем весёлым особенностям впридачу (типовая программа живёт в адресном пространстве одна, ей не доступны скорее всего никакие порты и устройства, есть RST XX для вызова "системы" и крутись как можешь) вырисовывается, что системный/привелегированный режим это не какой-то бит в системном порту, а триггер, переключаемый командами и прерываниями.

Передала система управления с помощью JP [IX/IY] (с двойным префиксом) или завершила прерывание по RETI/RETN - выключился системный режим. Пришло прерывание - включился системный режим. Вызвала несистемная программа RST XX - тоже включился. Всё.

Некоторая тонкость возникает при реентерабельных прерываниях и вообще про прерываниях в системном режиме. Получается, что он включится ещё раз (это вроде не беда), но при окончании - выключится, хотя не должен был. Это как-то не очень хорошо.

Подразумевавшееся ранее решение - сделать бит принудительной системности в системном порту, при которой всё работает не так и из которой можно выйти только этот бит сбросив. Но теперь я вообще сомневаюсь, что системный порт вообще нужен, хотелось бы отказаться и от этого бита, тем более, что для многоуровневой реентерабельности прерываний его и не хватит.

Первое решение - вообще не допускать прерываний в системном режиме, а для длинных задач (например, копирование памяти или вывод большого текста на экран) запускать условно прикладной процесс, давая ему требуемые страницы памяти. Реентерабельные прерывания идут лесом, но так как обработчики вообще будут короткими, то и ладно. Недостатки - нельзя использовать немаскируемые прерывания и в системном режиме HALT.

Второе решение - в системном режиме не допускать прерываний, не переключив таблицу векторов на другую - тем прерываниям не надо будет сохранять/восстанавливать контекст прикладной программы и указатель стека, они будут за счёт этого значительно быстрее, можно будет использовать HALT. Потребуется второй режим прерываний и запретить прикладным программам его переключать и менять регистр I (что обдумывалось с самого начала)... вопрос про немаскируемые...

И тут возникло (вот прямо в процессе написания прошлого абзаца, поскольку вся эта запись - аналог размышления вслух) такое решение - а обработчик немаскируемого прерывания может сам узнать, в каком режиме он работает - в системном или нет - просто прочитав значение регистра I. Дальше уже можно оставаться в системном или переключаться в него по обстоятельствам.

Получается, системный порт вообще не нужен, а признаком системности будет значение регистра I. Вероятно выходить из системного режима нужно будет не по просто RETI/RETN, а с префиксом.
Tags: КомпьютерноеЖелезо, ХочетсяСтранного
Subscribe

  • От субботы до субботы!

    Шкафчики красиво подвесил - в точности в той конфигурации, как они висели на прошлой их (не нашей!) кухне. Обнаружил небольшой уклон вбок (заметную…

  • (no subject)

    По тихой грусти прошёл тест по шкале депрессии Бека. Получил 11 (легкая депрессия, субдепрессия); потом подумал, что мой ответ про потерю веса…

  • (no subject)

    В общем, загад (вот гад!) не бывает богат. Из запланированного сделал абсолютный минимум. Эпиграфом субботы был анекдот про лягушку, ходившую по…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments