Общие сведения

Любая ЭВМ, соответствующая принципам работы Системы 360, имеет пять классов прерываний:

  • ввода-вывода;

  • внешние;

  • программные;

  • по вызову супервизора;

  • от схем контроля.

С точки зрения программиста, машина обрабатывает запросы прерываний следующим образом.

  1. Проверяется, разрешено ли запрашиваемое прерывание. Запрещены могут быть прерывания ввода-вывода (индивидуально для каждого из каналов ввода-вывода с номерами 0–5; для каналов с большими номерами имеется только общая маска), внешние прерывания, прерывания от схем контроля и четыре подкласса программных прерываний из пятнадцати. Биты масок прерываний входят в состав слова состояния программы PSW.

    Если прерывание запрещено, то в зависимости от его природы его запрос либо сохраняется в ожидании обработки, либо теряется.

  2. Из всех имеющихся разрешённых прерываний выбирается самое приоритетное:

    • самый высокий приоритет имеют прерывания от схем контроля;

    • на втором месте находятся программные прерывания, возникающие в процессе выполнения команды (но не её выборки), и прерывания по вызову супервизора — они являются взаимоисключающими. Как уже говорилось, четыре возможных причины программных прерываний могут быть замаскированы (к ним относится, в частности, прерывание по переполнению в операциях сложения и вычитания двоичных целых чисел со знаком); в этом случае их запросы теряются. Остальные причины программных прерываний — например, особые случаи адресации (попытка обращения к ячейке памяти, отсутствующей в данной машине) и защиты (попытка обращения к ячейке памяти, защищённой от данного вида доступа), — являются немаскируемыми и прерывают выполнение команды;

    • далее следуют внешние прерывания: от интервального таймера, от кнопки прерывания и по внешним сигналам 0–5. Запросы этих прерываний хранятся в ожидании обработки неограниченное время и очищаются либо произошедшим прерыванием, либо сбросом процессора. Если внешние прерывания запрещены, появление нескольких запросов от одного и того же источника вызовет в итоге лишь одно прерывание; скажем, если таймер сработает несколько раз и лишь после этого внешние прерывания будут разрешены, произойдёт лишь одно прерывание, и программа не сможет определить, что таймер срабатывал многократно. Когда внешнее прерывание, наконец, произойдёт, программе одновременно указываются все имеющиеся к этому моменту запросы;

    • формально на последнем, а фактически на предпоследнем месте по приоритетности находятся прерывания ввода-вывода. Если прерывание запрашивается одновременно несколькими каналами, будет обслужен лишь один запрос, остальные продолжат ожидать своей очереди;

    • хотя «Принципы работы Системы 360» прямо об этом не говорят, самый низкий приоритет имеют программные прерывания, возникающие при выборке команды. В Системе 370 и последующих версиях архитектуры это уже не так: прерывания при выборке команды имеют тот же приоритет, что и возникающие при выполнении команд.

  3. Выполняется сохранение информации о состоянии программы на момент прерывания:

    • в область памяти, адрес которой зависит от класса обрабатываемого прерывания, записывается так называемое старое PSW, т. е. содержимое слова состояния программы на момент возникновения прерывания. В числе прочей информации это PSW содержит адрес команды, которая должна была бы выполняться следующей, если бы прерывания не было, и код прерывания, точнее идентифицирующий причину его возникновения. Для прерывания по вызову супервизора это будет один байт информации, закодированной в самой команде SVC (предполагается, что это номер функции супервизора, которую последний должен выполнить, хотя реальное назначение этой информации зависит от операционной системы), для программного прерывания — код причины прерывания (некоторые причины программных прерываний могут иметь место одновременно, в этом случае указывается лишь одна из них), для внешнего прерывания — битовая маска, отражающая все имеющиеся запросы внешних прерываний одновременно, для прерывания ввода-вывода — адрес канала и устройства на канале, к которому относится прерывание. Для прерываний от схем контроля содержимое кода прерывания зависит от особенностей модели; оно может, например, указывать на источник возникшей проблемы;

    • в случае прерывания ввода-вывода дополнительно сохраняется слово состояния канала (CSW), содержащее информацию о конкретной причине прерывания и ходе операции ввода-вывода;

    • в случае прерывания от схем контроля дополнительно сохраняется содержимое различных аппаратных регистров процессора, что зависит от конкретной модели. Эта операция нередко именуется регистрацией состояния; сохранённая информация призвана помочь в поиске причины возникновения сбоя, а в некоторых случаях может позволить операционной системе, обрабатывающей прерывание, принять решение о дальнейших действиях.

  4. Выполняется загрузка нового PSW из области памяти, адрес которой зависит от класса прерывания. Это PSW содержит, в частности, новые маски прерываний и адрес первой команды обработчика прерывания.

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

  6. Если никаких разрешённых запросов прерываний больше нет, возобновляется обычное выполнение программы (или процессор переходит в ожидание, если в PSW установлен соответствующий бит).

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

Поскольку новое PSW может содержать недопустимый адрес команды (нечётный или указывающий недоступную область памяти), при попытке выборки первой же команды обработчика прерывания может возникнуть программное прерывание. Если недопустимый адрес задан в новом PSW программных прерываний, возникает бесконечная цепочка прерываний. В Системе 360 она может быть прервана сбросом процессора либо незамаскированным запросом прерывания ввода-вывода или внешним, а вот в Системе 370 — только сбросом процессора. Именно эта особенность и позволяет говорить, что в Системе 360 приоритет программных прерываний зависит от времени их возникновения (при выборке команды или при её выполнении).

В зависимости от влияния прерывания на выполнение команды в Системе 360 различают три вида окончания выполнения команды: завершение, подавление и прекращение.

При завершении (completion) выполнение команды полностью завершается, как если бы прерывания не было, а само прерывание произойдёт лишь после полного завершения команды. Завершение имеет место при прерываниях ввода-вывода и внешних, при некоторых подклассах программных прерываний (например, при двоичном или десятичном переполнении операция выполняется до конца; «лишние» данные, не помещающиеся в разрядную сетку, просто отбрасываются, и лишь после этого происходит прерывание, если оно разрешено) и при прерывании по вызову супервизора.

При подавлении (suppression) команда, по сути, не выполняется: единственной изменяемой информацией являются адрес команды в PSW (он будет указывать на команду, следующую за подавленной). Записываемый при прерывании в составе старого PSW двухбитовый код длины команды (ILC) обычно позволяет определить положение команды, вызвавшей прерывание, поскольку задаёт её длину в полусловах.

При прекращении (termination) выполнение команды останавливается «посредине процесса», в результате чего данные в памяти и регистрах могут быть частично изменены, а частично оставаться старыми, что делает, вообще говоря, невозможным перезапуск команды. Выполнение команды прекращается при прерывании от схем контроля и при некоторых программных прерываниях. Например, если в процессе выполнения десятичной операции была обнаружена неверная десятичная цифра, операция прекращается, при этом часть результата может быть уже записана в память, затерев, тем самым, часть одного из исходных операндов.

В Системе 370 появился ещё один вид окончания — аннулирование (nullification), отличающееся от подавления тем, что адрес команды, сохраняемый в старом PSW, указывает не на следующую команду, а на саму команду, вызвавшую прерывание. Это связано, главным образом, с расширением причин возникновения программных прерываний, а последнее вызвано, в первую очередь, внедрением механизма виртуальной памяти.

В процессоре ЭВМ ЕС-1020 обработка прерываний организована, как легко догадаться, почти исключительно микропрограммными средствами. Общий ход микропрограммного цикла, обеспечивающего выборку и выполнение команд, обработку прерываний и продвижение значения таймера, приведён на рисунке.

Общий цикл работы процессора, скан из [1]
Общий цикл работы процессора, скан из [1]

Три причины возникновения прерываний — по сбою машины, по особым случаям адресации и защиты — обнаруживаются аппаратно и вызывают немедленный аппаратный переход на соответствующую микропрограмму; остальные запросы могут обнаруживаться либо чисто микропрограммно, либо аппаратно, но переход на микропрограмму их обслуживания выполняется микропрограммным путём по результатам анализа соответствующих триггеров.

Прерывания от схем контроля

Средства аппаратного контроля были рассмотрены в предыдущей статье. Обнаружение сбоя, если прерывания от схем контроля разрешены (установлен бит маски PSW[13], состояние которого отражается триггером ТМКТРМ, он же бит 5 регистра РБР, описанного вместе с другими регистрами в одной из предыдущих статей), вызывает установку триггера ТКТРМ, что приводит к прекращению выполнения текущей микропрограммы и аппаратному переходу на микропрограмму обработки машинного сбоя, блок-схема которой приведена на следующем рисунке.

Блок-схема микропрограммы обработки машинных сбоев, скан из [1]
Блок-схема микропрограммы обработки машинных сбоев, скан из [1]

Как видно из блок-схемы, первым делом анализируется состояние триггера ТПЗП, он же бит 1 регистра РБД: он устанавливается на время выполнения первоначальной загрузки программы (как правило, операционной системы). Если ТПЗП установлен, т. е. сбой возник во время начальной загрузки, микропрограмма переводит процессор в состояние тяжёлого останова (устанавливается триггер ТТО).

Далее проверяется состояние триггера ТЦП, он же бит РБД[0]. Когда он установлен, выполняется микропрограмма обслуживания какого-либо из каналов; в этом случае управление передаётся микропрограмме обработки ошибок каналов. Её алгоритм не приводится, но в конце концов управление возвращается в общую микропрограмму обработки прерываний от схем контроля для выполнения регистрации состояния процессора и собственно прерывания от схем контроля (смены PSW). Микропрограмма обработки сбоев каналов вызывается и в случае, если выполняется команда ввода-вывода, причём её выборка уже полностью завершена (сброшен триггер выборки команды ТВК).

Затем производится регистрация, т. е. запись в основную память по строго определённым адресам содержимого некоторых аппаратных регистров. Конкретно в процессоре ЭВМ ЕС-1020 записываются регистр ошибок РО (в ячейку с шестнадцатеричным адресом 80), регистры РБД, РБС, РБР и байт состояния БА (соответственно в ячейки A0–A3).

Наконец, управление передаётся микропрограмме смены PSW. Эта микропрограмма является общей для всех обработчиков прерываний, поскольку все действия, специфичные для конкретного класса прерываний, производятся до её вызова.

Программные прерывания

В Системе 360 определено 15 причин программных прерываний, называемых в советской документации особыми случаями (exceptions). В ЕС-1020 два из них — особые случаи адресации и защиты — обнаруживаются чисто аппаратными средствами, и их возникновение приводит к прекращению выполнения текущей микропрограммы и переходу на микропрограмму обработки этих особых случаев; их обнаружение описывалось в статье, посвящённой памяти.

Остальные особые случаи обнаруживаются либо совместными усилиями аппаратуры и микропрограммы (например, неверная десятичная цифра или переполнение при сложении или вычитании двоичных целых чисел обнаруживаются схемами БА и приводят к установке соответствующих битов ББА, однако анализ состояния этих битов является обязанностью микропрограммы), либо чисто микропрограммными средствами (например, переполнение в десятичной операции возникает, если результат операции не помещается в поле основной памяти, отведённое под результат, что обнаруживает микропрограмма, записывающая результат).

Блок-схема микропрограммы обработки программных прерываний приведена на рисунке.

Блок-схема микропрограммы обработки программных прерываний, скан из [1]
Блок-схема микропрограммы обработки программных прерываний, скан из [1]

Для каждого особого случая, в обнаружении которого участвует микропрограмма, существует своя точка входа в микропрограмму обработки прерывания. В большинстве случаев её единственной задачей является формирование младшего байта кода прерывания — именно он отражает причину возникновения прерывания; на блок-схеме эта операция обозначена аббревиатурой ФКП. Куда именно в этот момент заносится код прерывания, литература не сообщает; я предполагаю, что он помещается в один из внутренних регистров процессора, например, в РЛ. После формирования кода прерывания управление передаётся общей части микропрограммы обработки программных прерываний.

Для четырёх особых случаев, которые могут быть замаскированы, — переполнения в операции с двоичными целыми числами, переполнения в десятичной операции, значимости и исчезновения порядка в операции с вещественными числами — микропрограмма проверяет соответствующий бит маски, находящийся в PSW. Если прерывание запрещено, производится переход на микропрограмму выборки следующей команды, если же разрешено, выполняется формирование младшего байта кода прерывания и управление передаётся общей части микропрограммы обработки программных прерываний. Для двух особых случаев, связанных с операциями с вещественными числами, значение маски определяет также способ формирования результата: если прерывание запрещено, формируется истинный нуль, если разрешено — оставляется «промежуточный» результат, возникновение которого и послужило причиной появления прерывания. На блок-схеме это не отражено; кроме того, почему-то не показана проверка маски для особого случая значимости. Заметим, что технически байт PSW, содержащий маски программных прерываний, хранится в одной из ячеек локальной памяти, куда он заносится в процессе загрузки PSW.

Микропрограмма обработки особых случаев адресации и защиты является общей для них и вызывается, как уже говорилось, чисто аппаратными средствами. Первым делом она проверяет, не выполнялась ли на момент обнаружения особого случая микропрограммная приостановка (МПРС) для обслуживания одного из каналов (это достигается анализом состояния триггера ТЦП), а затем — не выполнялась ли одна из команд ввода-вывода. Если проблема так или иначе связана с каналом, то её дальнейшей обработкой занимается микропрограмма обслуживания каналов; на блок-схеме она не показана и обсуждать её мы не будем (заметим лишь, что она прекратит операцию передачи данных, а в CSW, которое в конечном итоге будет записано при прерывании ввода-вывода, будет указана причина прекращения). Если же особый случай возник при выполнении «нормальной» команды процессора или при выборке команды, производится формирование кода прерывания и переход на общую часть микропрограммы. Для формирования правильного кода микропрограмма анализирует признаки соответствующих особых случаев — они отражаются двумя старшими битами регистра РБС.

Общая часть микропрограммы обработки программных прерываний формирует старший байт кода прерывания (в Системе 360 он всегда равен нулю) и передаёт управление микропрограмме смены PSW.

Прерывание по вызову супервизора

Это прерывание является самым простым. Оно происходит в результате выполнения команды SVC (ВЫЗОВ СУПЕРВИЗОРА); микропрограмма, реализующая данную команду, формирует код прерывания (старший байт равен нулю, младший байт равен второму байту кода команды SVC) и передаёт управление микропрограмме смены PSW.

Прерывания внешние и ввода-вывода и «главный цикл» процессора

Источниками прерываний ввода-вывода являются (кто бы мог подумать!) каналы ввода-вывода. Есть надежда, что когда-нибудь об организации ввода-вывода в Системе 360 вообще и в ЕС-1020 в частности будет написана отдельная серия статей, здесь же достаточно помнить, что запросы от каналов фиксируются в соответствующих триггерах регистра РБР, а другие триггеры этого же регистра хранят маски прерываний от каналов; с точки зрения программиста последние являются битами PSW[0:2]. Если одновременно установлен запрос от некоторого канала и соответствующий ему бит маски, по тактовому сигналу ТИ4 будет установлен триггер ТВВВ, что и послужит для процессора признаком необходимости отвлечься на обработку прерывания.

Про источники внешних прерываний мы поговорим в конце этой статьи, пока отметим, что их запросы устанавливают соответствующие триггеры регистра РБК. Наличие хотя бы одного установленного разряда в этом регистре вызывает формирование общего сигнала запроса внешнего прерывания. Если бит маски внешних прерываний (разряд PSW[7], он же триггер ТМПРВВ, он же бит 7 регистра РБР) установлен, запрос внешнего прерывания вызывает установку по тактовому импульсу ТИ4 того же самого триггера ТВВВ.

Этот триггер может устанавливаться — на этот раз уже без всяких масок — по запросу на обновление таймера и при установленном триггере ТОСТ, о чём будет сказано ниже.

Схема установки триггера ТВВВ приведена на рисунке.

Схема установки триггера ТВВВ, скан из [1]
Схема установки триггера ТВВВ, скан из [1]

Об условиях сброса ТВВВ литература не сообщает, но никаких микропрограммных способов для этого не упоминается. Возможно, что он сбрасывается аппаратно по тому же самому импульсу ТИ4, если нет никаких причин для его установки.

Состояние ТВВВ анализируется микропрограммно в «главном цикле» процессора, а именно, в самом начале микропрограммы выборки очередной команды, а также в цикле ожидания, о котором будет сказано позже. Блок-схема анализа и последующей обработки запроса, приведшего к установке ТВВВ, приведена на двух следующих рисунках.

Обработка запросов прерываний ввода-вывода и внешних, скан из [1]
Обработка запросов прерываний ввода-вывода и внешних, скан из [1]
Обработка остальных запросов, отражаемых состоянием ТВВВ, скан из [1]
Обработка остальных запросов, отражаемых состоянием ТВВВ, скан из [1]

Как видно из первой блок-схемы, если ТВВВ сброшен, производится обычная выборка и выполнение команды, после чего, как правило, «главный цикл» повторяется, начиная с анализа состояния ТВВВ. В случае возникновения незамаскированного машинного сбоя или при программном прерывании или прерывании по вызову супервизора вместо обычного завершения выполнения микропрограммы реализации текущей выполняемой команды и возврата на начало «главного цикла» управление получает микропрограмма обработки возникшего прерывания, но, в конечном итоге управление всё равно получит «главный цикл», только это произойдёт после смены PSW в рамках входа в обработчик прерывания.

Если ТВВВ установлен, выполняется анализ условий, которые могли привести к его установке.

Сначала проверяется наличие незамаскированного запроса внешних прерываний. Технически для этого микропрограмма анализирует состояние регистра РБК (он не должен быть равен нулю) и состояние бита маски РБР[7] (он должен быть установлен). Если незамаскированный запрос имеется, производится формирование кода внешнего прерывания (старший байт равен нулю, младший байт равен содержимому регистра РБК), очистка регистра РБК, т. е. сброс принятых к обработке запросов прерываний, и переход на микропрограмму смены PSW. Возможное наличие запросов прерываний ввода-вывода в этом случае игнорируется: их приоритет ниже, чем внешних прерываний.

Если запроса внешнего прерывания нет или он замаскирован, аналогичный анализ выполняется для запросов прерываний ввода-вывода, при этом одновременно определяется, какой из трёх каналов запросил прерывание и в зависимости от этого вызывается та или иная микропрограмма. Общим итогом её выполнения является запись в память слова состояния канала CSW, формируемого на основе информации, хранящейся в регистрах и триггерах канала, формирование кода прерывания, равного адресу канала и устройства ввода-вывода, и переход на микропрограмму смены PSW.

«За кадром» первой блок-схемы остаётся обслуживание таймера и состояния останова, что отчасти показано на второй блок-схеме.

Сначала, если необходимо, выполняется обновление таймера (об этом будет сказано позже), а затем анализируется его текущее значение. Если оно меньше нуля (старший бит значения таймера установлен), необходимо сформировать запрос внешнего прерывания от таймера, что выполняется микропрограммно: устанавливается бит 0 регистра РБК, что приведёт к установке триггера ТВВВ, если внешние прерывания разрешены. Если же значение таймера нулевое или положительное, запрос не формируется (однако, если он был сформирован ранее, он сохраняется: как уже говорилось, сбросить запрос внешнего прерывания может только выполнение внешнего прерывания либо сброс процессора).

Затем проверяется триггер останова ТОСТ, он же бит РБД[4]. Этот триггер устанавливается при нажатии кнопки останова на пульте управления, что приводит к прекращению выполнения команд и обслуживания прерываний: обнаружив установленное состояние ТОСТ, микропрограмма «главного цикла» процессора, как показано на блок-схеме, переходит на «цикл останова», технически являющийся микропрограммой обслуживания пульта, о чём будет сказано в следующей статье. Триггер ТОСТ сбрасывается при нажатии кнопки «Пуск», в результате микропрограмма обслуживания пульта возвращается в микропрограмму выборки команды, и весь описанный выше анализ повторяется.

Наконец, если ТОСТ сброшен, проверяется состояние бита состояния ожидания PSW[14], он же триггер ТЖС, он же бит РБД[2]. Если он установлен, происходит вход в цикл ожидания, на блок-схеме не показанный (он показан на блок-схеме микропрограммы загрузки PSW, речь о которой пойдёт ниже). Если же он сброшен, блок-схема указывает переход на выборку и выполнение команды, но это вызывает определённые сомнения. Дело в том, что, пока описанная микропрограмма анализа условий установки ТВВВ работала, могли возникнуть новые условия (скажем, появился запрос внешнего прерывания, которого изначально не было), и их надо обработать. Думается, что в реальности происходит переход на начало «главного цикла», т. е. на повторный анализ состояния ТВВВ, и выборка команды будет выполнена, лишь если он сброшен.

Микропрограмма смены PSW

Как мы увидели, все микропрограммы обслуживания запросов прерываний в конечном итоге вызывают микропрограмму смены PSW, поскольку вход в обработчик любого прерывания заключается в записи старого и загрузке нового PSW. На входе эта микропрограмма получает код прерывания (где именно он находится, литература умалчивает; можно предположить, что в регистрах общего пользования РЛ и РД, но это не обязательно) и адрес второго полуслова старого PSW, находящийся в адресном регистре РГРИ; неясно, обнуляются ли регистры РГ и РР микропрограммами обработки прерываний или же они лишь заносят младший байт адреса в РИ: поскольку старшие биты адреса всегда равны нулю, с точки зрения экономии ёмкости постоянной памяти логичней обнулять их уже в микропрограмме смены PSW.

Микропрограмма смены PSW состоит из двух частей: первая сохраняет в основной памяти старое PSW, а вторая производит загрузку нового. Блок-схема первой части приведена на рисунке.

Микропрограмма сохранения PSW, скан из [1]
Микропрограмма сохранения PSW, скан из [1]

Как видим, первым делом микропрограмма заносит нулевой ключ доступа в регистр РБЗ: это, по сути, отключает защиту памяти. Сразу после этого производится запись в ОП кода прерывания; он занимает второй и третий байты старого PSW, и именно поэтому микропрограмме смены PSW передаётся адрес второго полуслова, а не начала PSW.

Затем в ОП сохраняются два младших байта адреса команды. Они должны попасть в четвёртое полуслово PSW, так что сначала производится изменение младшей части адреса PSW в регистре РИ. Поскольку все PSW выровнены в памяти по границе двойного слова, для обращения к тому или иному полуслову PSW достаточно менять биты РИ[5:6]; в данном конкретном случае для перехода от второго к четвёртому полуслову нужно установить бит 5, не изменяя остальные разряды. Обычно адрес следующей команды находится в адресном регистре РМФЕ, однако при выполнении некоторых команд этот регистр (точней, входящие в его состав однобайтовые регистры РФ и РЕ) используется в качестве рабочего, а адрес команды сохраняется в локальной памяти. Местоположение адреса указывается состоянием триггера ТАК, поэтому микропрограмма анализирует его, при необходимости загружает адрес команды из локальной памяти в РМФЕ и лишь затем записывает в четвёртое полуслово PSW в ОП содержимое регистров РФ и РЕ.

Следом сохраняется третье полуслово PSW, для чего первым делом опять меняется адрес в регистре РИ (сбрасывается бит 6). Младший байт третьего полуслова PSW содержит восемь старших разрядов 24-разрядного адреса команды, так что в него будет записано содержимое регистра РМ. А вот старший байт третьего полуслова представляет собой «сборную солянку», содержащую двухбитовый код длины команды (ILC), двухбитовый же код условия (CC) и четырёхбитовую маску программы. Последняя хранится в локальной памяти, CC содержится в разрядах 6 и 7 регистра РБС, а ILC формируется микропрограммно «на лету». Если прерывание (программное или от схем контроля; остальные прерывания всегда происходят только между командами — после завершения выполнения одной команды и до начала выборки следующей) произошло в момент выборки команды, о чём свидетельствует установленный триггер ТВК, ILC будет равен нулю: это означает, что адрес, сохраняемый в старом PSW, не является адресом следующей команды, и определить его невозможно (он мог уже быть частично модифицирован в процессе выборки). Если же ТВК сброшен, команда уже была выбрана или ещё не выбиралась, а соответственно, в РМФЕ находится адрес следующей команды; ILC в этом случае формируется, исходя из кода последней выбранной команды, который был сохранён в локальной памяти: он устанавливается равным 01 для команды длиной одно полуслово, 10 для двух полуслов и 11 для трёх полуслов.

Пара «лирических отступлений». В Системе 360 прерывание в момент выборки команды всегда является фатальным: оно может быть вызвано либо сбоем аппаратуры, либо программной ошибкой (попыткой выборки из недоступной области памяти, что приводит к возникновению особого случая адресации или защиты). Нулевой ILC, указывающий на невозможность определения правильного адреса команды, является в этой ситуации достаточно разумным. А вот в Системе 370 из-за появления виртуальной памяти и ряда других технических средств прерывание во время выборки или в процессе выполнения команды уже не всегда свидетельствует о программной или аппаратной ошибке (например, вся или часть команды может находиться в выгруженной странице памяти). По этой причине при разработке этой версии архитектуры обстоятельства, при которых может указываться нулевой ILC, были пересмотрены. Например, при прерывании в процессе выборки команды в старом PSW сохраняется адрес выбираемой команды, увеличенный на 1, 2 или 3 полуслова (даже если не удалось выбрать первое полуслово команды), и ILC, указывающий, на какую величину адрес был увеличен; в результате ОС может правильно определить адрес команды, чья выборка оказалась неудачной, после чего при необходимости скорректировать возникшую проблему (например, подгрузить недостающую страницу памяти) и перезапустить команду.

Второе отступление касается сохраняемого адреса команды. Старший его байт, как было сказано выше, подаётся из регистра РМ, но этот регистр является «обрезанным»: содержит не восемь, а всего три разряда, причём старший из них, бит 5, устанавливается, если при записи в регистр установлен хотя бы один из разрядов 0:5, т. е. любой из старших шести битов полного 24-разрядного адреса, — его установка свидетельствует о формировании адреса, выходящего за пределы максимально возможного на ЕС-1020 объёма основной памяти, и попытка обращения к такому адресу вызывает соответствующее программное прерывание. В том случае, если недопустимым является адрес операнда, а также в случае формирования недопустимого адреса следующей команды при увеличении последнего допустимого адреса в процессе последовательного выполнения команд проблем нет. Однако в случае, когда недопустимый адрес команды заносится командой перехода, при попытке выборки следующей команды возникает прерывание, но старшие шесть разрядов сохранённого в старом PSW адреса команды могут отличаться от адреса, на который был выполнен переход. Скажем, при попытке перехода на шестнадцатеричный адрес E01020 в регистр РМ будет занесено двоичное значение 100, и в старом PSW программных прерываний будет указан адрес команды 041020. Формально, это не нарушает принципы работы Системы 360: поскольку ILC в том же PSW будет равен нулю (прерывание возникло при выборке команды), адрес команды считается недостоверным, однако сохранение истинного адреса могло бы быть полезным при отладке программы.

Возвращаемся к микропрограмме сохранения PSW. Последним записывается его первое полуслово, старший байт которого содержит маски прерываний от каналов ввода-вывода и внешних, а младший — ключ доступа программы, маску прерываний от схем контроля и биты режимов: ASCII, супервизора и ожидания. Вся эта информация при загрузке нового PSW в неизменном виде записывается в локальную память, поэтому при сохранении старого PSW она просто извлекается из ЛП, а не собирается «по кусочкам».

Последним действием микропрограммы сохранения PSW является формирование адреса двойного слова ОП, откуда должно быть выбрано новое PSW, и передача управления микропрограмме загрузки PSW. Последняя используется не только в рамках микропрограммы смены PSW при прерываниях, но также при завершении начальной загрузки программы и микропрограммой реализации команды ЗАГРУЗКА PSW (LPSW; именно эта команда используется операционной системой, чтобы завершить обработку прерывания, загрузив ранее сохранённое старое PSW, или для передачи управления, используя современную терминологию, потоку пользователя). Вычисление адреса области нового PSW некоторого класса прерываний элементарно: оно всегда на шестнадцатеричную величину 40 больше адреса области старого PSW — а именно этот адрес находится в РГРИ в момент завершения сохранения старого PSW.

Блок-схема микропрограммы загрузки нового PSW приведена на следующем рисунке.

Микропрограмма загрузки PSW, скан из [1]
Микропрограмма загрузки PSW, скан из [1]

Сначала из памяти считывается четвёртое полуслово нового PSW, содержащее два младших байта адреса команды; они записываются в локальную память (ячейки 8E и 8F) и в регистры РФ и РЕ.

Затем считывается третье полуслово; оно будет записано в ячейки ЛП 8C и 8D. Его младший байт, содержащий старшие разряды адреса команды, заносится в регистр РМ; как результат, в РМФЕ оказывается полный адрес команды, которая будет выполнена после завершения загрузки PSW.

Со старшим байтом ситуация несколько сложней. Формально он состоит из трёх полей — ILC, CC и маски программы. Код длины команды в новом PSW никакой роли не играет, поскольку единственное его назначение — дать возможность ОС определить адрес команды, вызвавшей прерывание, а соответственно, он имеет смысл только в старом PSW, сохраняемом при прерывании. Код условия используется программой постоянно, поэтому в процессоре он хранится в не в ЛП, а битах 6 и 7 регистра РБС; соответственно, микропрограмма загрузки PSW выделяет его из старшего байта третьего полуслова загружаемого PSW и помещает в РБС[6:7]. И лишь четыре бита маски программы сохраняются в локальной памяти для реального использования микропрограммами, когда они понадобятся.

Второе полуслово нового PSW никак не используется и поэтому не загружается: там содержится код прерывания, а соответственно, оно играет роль только в старом, но не новом PSW.

Первое полуслово после считывания помещается в ячейки ЛП 88 и 89. Кроме того, маски каналов, внешних прерываний и прерываний от схем контроля заносятся в соответствующие биты регистра РБР, а бит ожидания — в бит РБД[2] (последнее вызовет включение соответствующей лампы на пульте управления).

В состав младшего байта первого слова входит также ключ доступа. Если процессор имеет средства защиты памяти (установлен триггер ТБЗ), ключ заносится в биты 4:7 регистра РБЗ, чтобы в дальнейшем обеспечивать аппаратный контроль доступа выполняющейся программы к памяти, как описывалось в одной из предыдущих статей. Если же защита памяти отсутствует (ТБЗ сброшен), микропрограмма проверяет ключ из загруженного PSW на равенство нулю: при нарушении этого требования возникает программное прерывание по особому случаю спецификации и управление передаётся соответствующей микропрограмме. Заметим, что технического смысла в запрете использования ненулевого ключа на ЭВМ без защиты памяти нет, это просто требование архитектуры.

Далее мы видим анализ бита PSW[14] — признака режима ожидания, и в обоих последующих ветвях выполняются идентичные действия: сброс триггера первоначальной загрузки программы ТПЗП и, возможно, триггера первого сбоя ТПСБ. Конечно, подобное дублирование действий вполне возможно, но представляется, что более вероятным является ошибка на блок-схеме, и анализ PSW[14] выполняется уже после указанных действий.

Со сбросом ТПЗП, он же бит РБД[1], всё просто. Он устанавливается при нажатии на пульте управления кнопки «Загрузка», что инициирует выполнение начальной загрузки программы с заданного внешнего устройства. Загрузка заканчивается считыванием нового PSW из двойного слова памяти с адресом 0, после чего под управлением этого PSW начинается выполнение загруженной программы. Поскольку для всех случаев загрузки PSW используется одна и та же микропрограмма, она сбрасывает ТПЗП независимо от того, по какой именно причине выполняется загрузка PSW. Единственным последствием этого сброса является выключение индикаторной лампы на пульте, что позволяет оператору ЭВМ судить о технически корректном завершении загрузки (если загрузка до конца выполнена не была — например, возник какой-то сбой, — лампа загрузки остаётся гореть).

А вот со сбросом ТПСБ на блок-схеме явно имеется ошибка, причём в обеих ветках. Если верить блок-схеме, сброс этого триггера происходит в случае, если загрузка нового PSW выполнялась соответствующей командой процессора, а не в результате прерывания. В реальности всё должно быть наоборот: ТПСБ сбрасывается в конце микропрограммы входа в обработчик прерывания по машинному сбою, а она, как и любая другая микропрограмма входа в прерывание, заканчивается выборкой нового PSW. Скорей всего, он сбрасывается вообще всегда, без дополнительного анализа на выполнение команды LPSW: если микропрограмма, реализующая эту команду, успешно дошла до конца, т. е. загрузила PSW, значит, никакого сбоя в процессе её выполнения не возникло и, следовательно, ТПСБ и так сброшен, и повторный его сброс ни к каким реальным последствиям не приведёт.

Вернёмся к различиям в микропрограмме в зависимости от состояния бита ожидания PSW[14]. Если этот бит сброшен, процессор должен обычным образом выполнять программу — и управление передаётся микропрограмме «главного цикла», анализирующей состояние триггера ТВВВ и, если он сброшен, выбирающей и выполняющей очередную команду.

Если же PSW[14] установлен, процессор переходит в состояние ожидания. В этом состоянии команды не выполняются, однако возникающие запросы прерываний, если они разрешены, обрабатываются. Например, операционная система ОС ЕС, «в девичестве» OS/360, устанавливает этот бит, если у неё нет никакой работы, предварительно программируя таймер на выдачу запросов прерываний и обеспечивая, тем самым, ход программно реализованных часов (аппаратные часы появились только в Системе 370). В ЕС-1020, как видно из блок-схемы, в этом случае микропрограмма входит в цикл ожидания, в котором непрерывно проверяется состояние триггера ТВВВ. Пока он сброшен, запросов прерываний нет, а соответственно, процессор стоит и ничего, с точки зрения программиста, не делает. Когда появляется разрешённый запрос прерывания внешнего или ввода-вывода, ТВВВ устанавливается и происходит обычный переход на обслуживание этого запроса, что приведёт к загрузке нового PSW, в котором, как правило, бит ожидания сброшен, — и процессор возобновляет обычное выполнение команд.

Источники внешних прерываний

Система 360 предусматривает три разных источника внешних прерываний: кнопка прерывания на пульте управления, интервальный таймер и набор внешних сигналов.

Самым простым и очевидным источником является кнопка прерывания. Когда она нажимается, аппаратно устанавливается бит 1 регистра РБК; он остаётся установленным до тех пор, пока микропрограмма не обнулит этот регистр, что происходит в процессе вызова программы обработки внешних прерываний, как уже говорилось выше. Назначение кнопки прерывания, очевидно, зависит от операционной системы; в ОС ЕС её нажатие приводило к переключению консольных терминалов (ОС переходила с одной консоли на другую, что могло использоваться, в частности, при выходе из строя основной консоли). Правда, на ЕС-1020 эта система вряд ли использовалась из-за очень малой производительности машины, хотя в ОС ЕС издания 4 она официально поддерживалась (в ОС ЕС издания 6 поддержку формально удалили, хотя технически система работать по-прежнему могла). Для чего служило это прерывание в более ранней и намного более примитивной ДОС ЕС, она же DOS/360, я не знаю — вполне возможно, для того же самого.

Интервальный таймер в Системе 360 является единственным средством отсчёта времени, причём, строго говоря, не является обязательным (хотя, похоже, присутствовал во всех советских и подавляющем большинстве других воплощений архитектуры). Он реализован не очень удачно, поэтому в Системе 370 появились альтернативные средства, а в более поздних версиях архитектуры интервальный таймер был вообще исключён.

С точки зрения программиста текущее значение интервального таймера хранится в слове основной памяти с шестнадцатеричным адресом 50, поэтому программе для получения текущего значения таймера достаточно выполнить любую команду, считывающую это слово. Время от времени процессор уменьшает значение таймера и, как только оно становится отрицательным, т. е. как только в результате уменьшения его старший бит устанавливается, формируется запрос прерывания. Физическая частота обновления значения таймера зависит от модели, однако логически уменьшение производится путём вычитания шестнадцатеричного значения 00000100 с частотой 300 Гц (или, что то же самое с точки зрения частоты формирования прерываний, путём вычитания единицы с частотой 76800 Гц). На практике частота обновления таймера была обычно привязана к частоте питающей сети — 50 Гц в большинстве стран, включая СССР, и 60 Гц в США и ещё нескольких странах; собственно, «официальная» частота обновления в 300 Гц выбрана как наименьшее общее кратное этих двух частот.

В ЕС-1020 работа таймера организована следующим образом. В состав аппаратуры процессора, относящейся к пульту управления, входит специальный регистр Р9. Его старшие четыре бита всегда равны нулю, а младшие четыре являются счётчиком, чьё значение увеличивается с частотой 50 Гц. Если значение данного регистра отлично от нуля, формируется запрос на обновление таймера, что приводит, как уже говорилось выше, к установке триггера ТВВВ. Микропрограмма перед выборкой очередной команды или в цикле ожидания анализирует состояние этого триггера; если он установлен из-за ненулевого значения Р9, будет вызвана микропрограмма обновления таймера. Эта микропрограмма считывает из ОП полуслово по адресу 52, т. е. младшую половину значения интервального таймера, и вычитает из его старшего байта текущее содержимое Р9, после чего Р9 обнуляется. Обновлённое полуслово записывается обратно в память, и если при вычитании заёма в его старший разряд не возникло, обновление таймера завершается. Если же был обнаружен заём, производится считывание старшего полуслова, находящегося по адресу 50, вычитание из него единицы и запись результата обратно в ОП. Если во время этого вычитания произошёл переход от положительного значения к отрицательному, микропрограмма устанавливает запрос прерывания от таймера — бит 0 регистра РБК, что в конечном итоге приведёт к обработке внешнего прерывания.

Поскольку проверка состояния ТВВВ производится лишь в определённые моменты работы процессора, а, кроме того, запрос обновления таймера имеет меньший приоритет, чем запросы прерываний ввода-вывода и внешних, возможна ситуация, когда фактическое обновление значения таймера в ОП будет происходить реже, чем 50 раз в секунду. В случае интенсивного ввода-вывода, особенно в мультиплексном канале, который обслуживается чисто микропрограммными средствами, возможна ситуация, когда счётчик Р9 переполнится; в этом случае, очевидно, учёт времени операционной системой окажется неточным. Это, пожалуй, основной недостаток интервального таймера, послуживший причиной его замены.

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

Третий и последний источник запросов внешних прерываний — так называемые внешние сигналы. С точки зрения архитектуры, они являются необязательным техническим средством и обычно входят в состав интерфейса прямого управления, хотя могут быть реализованы и самостоятельно, без наличия всего этого интерфейса. В Системе 370 механизм внешних сигналов и интерфейс прямого управления были объявлены устаревшими и впоследствии полностью исключены из архитектуры.

Хотя интерфейс прямого управления является необязательным, во всех советских реализациях Системы 360, созданных в рамках ЕС ЭВМ (ЕС-1020, 1022, 1030, 1033, 1050 и 1052), он всегда присутствовал. Как обстояло с ним дело в ЕС ЭВМ, выпускавшихся в других социалистических странах, и в позднесоветских машинах, а также в советских машинах, не входящих в ЕС ЭВМ (например, в М-4000/4030), мне неизвестно.

Интерфейс прямого управления предназначен, в первую очередь, для соединения между собой двух процессоров, образующих двухпроцессорную или двухмашинную систему. Разница между этими двумя вариантами заключается в том, что в двухпроцессорной машине основная память является общей для обоих процессоров, работающих под управлением одной операционной системы, что концептуально ничем не отличается от современных компьютеров с многоядерными процессорами; в то время как двухмашинная система состоит из двух полностью независимых ЭВМ, а интерфейс прямого управления просто позволяет им быстро обмениваться сигналами. Заметим, что ЕС-1020 позволяет построить многомашинную систему (возможно, с машинами разных моделей), но не позволяет реализовать многопроцессорную: основная память в этой модели имеет всего один «вход», что не позволяет подключить к ней несколько процессоров.

Технически в состав интерфейса прямого управления входят следующие линии:

  • ВЫХ-Ш0 — ВЫХ-Ш7 — линии для выдачи одного байта информации из процессора;

  • ВХ-Ш0 — ВХ-Ш7 — линии для приёма одного байта информации в процессор;

  • ЛС-0 — ЛС-7 — выходные линии синхронизации;

  • ВС-0 — ВС-7 — входные линии синхронизации;

  • ВЫХ-ЛЧТ — выходная линия чтения;

  • ВХ-ЛЧТ — входная линия чтения;

  • ВЫХ-ЛЗП — выходная линия записи;

  • ВХ-ЛЗП — входная линия записи.

При соединении между собой двух процессоров выходные линии одного процессора подаются на соответствующие входные линии другого процессора, и наоборот, как показано (с несколькими ошибками) на рисунке. Возможно также использование внешнего «коммутатора», позволяющего соединить между собой не два, а большее количество процессоров.

Соединение двух процессоров интерфейсом прямого управления, скан из [1]
Соединение двух процессоров интерфейсом прямого управления, скан из [1]

В качестве источников внешних прерываний используются входные линии ВС-2 — ВС-7 (заметим, что две старшие линии, ВС-0 и ВС-1, в таком качестве выступать не могут). В ЕС-1020 появление на любой из этих линий логической единицы приводит к установке соответствующего разряда регистра РБК, что и формирует запрос внешнего прерывания. Однажды установленный разряд РБК остаётся установленным до его микропрограммной очистки, т. е. линии ВС воздействуют фронтом сигнала, а не его уровнем.

Для взаимодействия с интерфейсом прямого управления Система 360 имеет две привилегированные команды — ПРЯМОЕ ЧТЕНИЕ (RDD) и ПРЯМАЯ ЗАПИСЬ (WRD). Обе этих команды имеют формат SI и включают два операнда: одним из них является содержимое байта памяти, адрес которого задаётся полями команды B1 и D1, а вторым — значение длиной байт, входящее в состав самого кода команды (поле I2).

Команда WRD считывает из памяти байт информации и выдаёт его по линиям ВЫХ-Ш0 — ВЫХ-Ш7, причём состояние этих линий будет оставаться неизменным до следующего выполнения команды WRD. Одновременно с этим по линиям ЛС-0 — ЛС-7, которым соответствуют единичные биты второго операнда команды, передаются импульсы длительностью 500—1000 нс, которые на принимающей стороне служат запросами прерываний (ВС-0 и ВС-1, как уже говорилось, прерывание не вызывают, но они могут использоваться внешним коммутатором или другим устройством для своих целей). Кроме того, импульс выдаётся и на линию ВЫХ-ЛЗП, что служит индикатором обновления состояния прочих линий.

Команда RDD несколько сложнее. Подобно команде WRD, она выдаёт синхросигналы на те линии ЛС-0 — ЛС-7, которым соответствуют единичные биты второго операнда, но сопровождает их выдачей импульса по линии ВЫХ-ЛЧТ. После завершения этих импульсов она в течение как минимум 500 нс следит за состоянием линии ВХ-ЛЗП; если в течение всего этого периода данная линия неактивна, т. е. другой процессор не пытается выполнить запись информации на интерфейс прямого управления, она считывает линии ВХ-Ш0 — ВХ-Ш7 и записывает полученное значение в память по адресу своего первого операнда.

Команда RDD может «зависнуть»: если линия ВХ-ЛЗП постоянно активна, она никогда не прекратит ожидание, и выйти из этого состояния можно только сбросом процессора, что является одним из недостатков использования интерфейса прямого управления для межпроцессорной коммуникации.

Литература

  1. В. В. Пржиялковский и др. Процессор ЭВМ ЕС-1020. Под общей редакцией А. М. Ларионова. — М., "Статистика", 1975.

Комментарии (4)


  1. rutenis
    29.07.2023 03:14
    +1

    Небольшое дополнение: в архитектуре предусмотрена возможность атомарно прочитать показания интервального таймера и установить новое значение. Для этого слова по адресам 4C и 54 оставлены неиспользуемыми процессором; считывание и установка выполняются одной командой

    MVC 76(8),80


    1. SIISII Автор
      29.07.2023 03:14

      Ну, про это я писать не стал, поскольку сие касается программирования, а не внутреннего устройства конкретной модели.


  1. victor_1212
    29.07.2023 03:14
    +1

    немного про историю разработки системы прерываний, - сама идея прерываний появилась очень рано, на UNIVAC 1103 (1953) были прерывания по переполнению, DYSEAC (1954) использовал I/O interrupts + DMA, кстати одна из первых мобильных машин, MIT TX-2 (1957) имела многоуровневую систему прерываний, IBM 7030 (1961) Stretch типа объединяла все что было разработано вместе, имела векторную систему - 64 битовый регистр прерываний, 28 битов которого могли быть маскированы, 19 битовый таймер+36 битовые часы с разрешением 1 msec, возможность прерывания по чтению данных, архитектура 360 делалась на основе 7030, т.е. типа развитие + упрощение IBM Stretch, одним из главных разработчиков системы прерываний как для Stretch так и для 360 был Brooks, автор известной книги "мифический человеко-месяц", ему принадлежат патент 1962 года на систему прерываний (US №3048332)


  1. vadimr
    29.07.2023 03:14

    Физическая частота обновления значения таймера зависит от модели, однако логически уменьшение производится путём вычитания шестнадцатеричного значения 00000100 с частотой 300 Гц (или, что то же самое с точки зрения частоты формирования прерываний, путём вычитания единицы с частотой 76800 Гц). 

    Тут, на мой взгляд, не совсем аккуратно сформулировано. Значение интервального таймера обновляется в среднем на столько же, как если бы из него вычиталась единица с частотой 76800 Гц. Но фактическая частота прерываний (и, соответственно, величина декремента) может быть любой и зависит от модели.