masterspammer (masterspammer) wrote,
masterspammer
masterspammer

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

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

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

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

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

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

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

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

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

  • Техноорки

    Началось с того, что у жены в машине начал часто загораться индикатор аккумулятора и иногда возникать глюки зажигания на полной нагрузке…

  • Заусенец

    Переклеил, ага, но что-то чуйка не даёт считать дело законченным. Магнит купил, определил и подписал полюса, плюсы и минуса. Парный динамик уже…

  • Про мембраны и магниты

    Переклеенное тело заработало как надо ( UPD. - на самом деле - нет). Теперь у меня будет* пара драйверов, играющих (вот сейчас на АЧХ посмотрел)…

  • 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