Цикл статей, начинаемый этой публикацией, посвящён внутреннему устройству нескольких отечественных моделей ЕС ЭВМ, начиная с самой младшей из них — ЕС-1020.
В данной статье будет сказано несколько слов о причинах появления ЕС ЭВМ (исторические вопросы довольно подробно описаны в других источниках, поэтому я не буду здесь повторять других авторов, а желающих подробнее ознакомиться с этой темой адресую, например, в «Виртуальный компьютерный музей»), но в первую очередь будет дан краткий обзор основных особенностей архитектуры IBM System/360, реализованной в ЕС ЭВМ: без знакомства с архитектурой затруднительно понять причины и назначение довольно многих технических решений, принятых при её реализации. Собственно схемотехника начнётся со следующей статьи.
Предыстория
Как известно, в ранних вычислительных машинах всех стран, в том числе США и СССР, не было разделения между архитектурой и реализацией: почти каждая новая машина была совершенно несовместима с более ранними разработками, а её архитектура (в первую очередь — система команд) была тесно связана со схемотехническими решениями. Кроме того, внешние устройства подключались к машине каждое по своему собственному, зачастую уникальному интерфейсу, поэтому для добавления, скажем, нового принтера могли потребоваться доработки в аппаратуре процессора. Всё это представляло большие неудобства для пользователей и делало невозможным более-менее дешёвый «апгрейд»: требовалось менять сразу всю аппаратуру и заново писать все необходимые программы, и даже перенос данных мог создать определённые проблемы.
В 1964 году компания IBM впервые в истории анонсировала не новый компьютер, а новое семейство совместимых компьютеров — System/360. Цифра 360 в названии означала «360 градусов»: по утверждению фирмы, эти машины годились для решения всего круга возможных задач (что, конечно же, было не так даже на тот момент, но как же в капиталистической стране без рекламы?). В этой серии машин впервые были реализованы следующие принципы, которые сейчас кажутся абсолютно естественными.
Полное отделение архитектуры вычислительной машины от её физической реализации: система команд, принципы обработки прерываний, организация ввода-вывода и т. п. едины для всех моделей Системы 360 независимо от их внутреннего устройства, что обеспечивает переносимость программ как между ними, так и на будущие модели — при условии, конечно, что программа не использует ресурсы, имеющиеся на одной модели, но отсутствующие на другой. Хотя программно совместимые машины встречались и раньше (например, IBM 1401 и 1410), только в Системе 360 этот принцип был, хотя бы в теории, проведён до конца, в полном объёме и заранее распространялся не только на анонсированные, но и на будущие модели. Правда, нельзя не отметить, что, хотя в общем и целом IBM своё обещание выполнила, и прикладные программы, написанные в 1965 году для любой из первых моделей Системы 360, технически можно использовать и сегодня на любом современном мэйнфрейме IBM z/Architecture (что делает эту архитектуру, вероятно, самой старой из не утративших актуальность), в процессе развития модельного ряда Системы 360 она временами нарушала свои же принципы. Например, появившаяся несколько позже первых машин модель 20, призванная стать самой дешёвой, получилась в результате сильно урезанной, откровенно неполноценной, и не обладала полной совместимостью с другими, «настоящими» моделями. Кроме того, в формальных рамках Системы 360 было создано несколько полуэкспериментальных машин, а также моделей, созданных по особым требованиям заказчиков (например, для НАСА), где совместимость тоже в чём-то нарушалась. Тем не менее, общий курс на соблюдение совместимости в общем и целом соблюдался.
Разбиение машинного слова (32 бита) на несколько более мелких элементов — впервые появившихся 8-разрядных байтов. Память адресовалась именно байтами, а не словами, как в любых более ранних машинах, что сильно упрощало программирование задач, не связанных с научно-техническими расчётами (например, обработку текстовой информации).
Единый интерфейс ввода-вывода для подключения любых устройств, что позволяло добавлять и заменять устройства или процессоры без необходимости менять остальное оборудование. Естественно, имелись ограничения, связанные с производительностью; например, скоростные диски нельзя было подключить к младшим моделям, поскольку их каналы ввода-вывода не обеспечивали минимально необходимую скорость передачи, но периферию младших моделей можно было подключать к старшим, что обеспечивало плавное обновление оборудования по мере необходимости.
Поставки машин начались с 1965 года, и они быстро завоевали популярность, несмотря на высокую стоимость (самый дешёвый вариант младшей на тот момент модели 30 с 8 Кбайтами памяти стоил, кажется, порядка 130 тысяч тогдашних долларов, т. е. больше миллиона на современные деньги).
Когда в СССР задумались о внедрении ЭВМ в народное хозяйство (в частности, в рамках прорабатываемой, но так в итоге и не реализованной «Общегосударственной автоматизированной системы учёта и обработки информации»), быстро выяснилось, что по-настоящему подходящих машин у нас попросту нет. После нескольких лет обсуждений на тему «создавать с нуля или копировать, а если копировать, то у кого» было принято решение скопировать архитектуру System/360 и разработать на её основе ряд своих машин, получивших название Единой Системы ЭВМ. С самого начала предполагалась кооперация в рамках Совета экономической взаимопомощи (СЭВ) — экономического объединения большинства социалистических стран во главе с СССР. В частности, в разработке и производстве собственно машин первой очереди участвовали:
СССР — ЕС-1020, ЕС-1030, ЕС-1050;
ВНР — ЕС-1010;
ЧССР — ЕС-1021;
ГДР — ЕС-1040.
Хотя все эти машины изначально задумывались как полностью совместимые, не всё пошло так, как планировалось. Венгерская ЕС-1010 вообще никакого отношения к Системе 360 не имеет — это 16-разрядный компьютер совершенно другой архитектуры (на Википедии в качестве её прототипа указывается французская мини-ЭВМ Mitra 15, но ни подтвердить, ни опровергнуть это я не могу). Чехословацкая ЕС-1021 реализует лишь подмножество команд Системы 360 и несовместима с последней на системном уровне — таким образом, эту машину нельзя считать полноценной реализацией архитектуры. Остальные четыре ЭВМ, однако, действительно полностью совместимы между собой и с американскими «предками».
Так или иначе, младшей из «настоящих» ЕС ЭВМ стала ЕС-1020, разработанная в Минске и производившаяся с 1971 по 1975 год. Вопреки иногда встречающемуся мнению, она не является копией и даже близким аналогом модели 30 Системы 360: хотя отдельные элементы внутреннего устройства действительно похожи (что неудивительно, учитывая идентичную архитектуру и близкие исходные требования — создать как можно более дешёвую машину), в целом эти ЭВМ различаются очень сильно. В частности, у «американки» реализовано 16 линий физического адреса, а у нашей машины — 18 (что потребовало иной конструкции адресных регистров); ширина доступа к памяти «у них» — один байт, а у нас — два байта (что влечёт изменение в регистре данных памяти); серьёзно различается структура микрокоманды и другие детали реализации процессора. Коротко говоря, в данном случае мы скопировали архитектуру IBM, но не реализацию.
Следует заметить, что все ранние ЕС ЭВМ имели весьма посредственную надёжность, но дело не в порочности самих проектов, а в низком качестве микросхем ранних выпусков. Когда технологические проблемы микроэлектронного производства были решены, качество элементной базы стало, по большей части, вполне удовлетворительным, а вместе с ним резко возросла и надёжность вычислительной техники — но это касалось, главным образом, уже более поздних машин, производившихся с середины 1970-х годов.
Напоследок замечу, что совместимыми с Системой 360 в нашей стране были не только ЕС ЭВМ. Например, в те же годы в рамках «Агрегатной системы средств вычислительной техники» (АСВТ) была разработана ЭВМ М-4000 и её модификации М-4030 и М-4030-1 (последняя по своим возможностям соответствовала самому первому варианту архитектуры Системы 370 — с некоторыми расширениями системы команд и средств отсчёта времени, но ещё без поддержки виртуальной памяти). Довольно сложно понять, зачем в сверхцентрализованном СССР распыляли силы на решение разными организациями одних и тех же задач, но что было, то было.
Основные особенности архитектуры
Подробное англоязычное описание архитектуры Системы 360 можно найти в Сети (поисковый запрос вида «System 360 principles of operations»; всего существует восемь редакций этого руководства — от первоначального A22-6821-0 до финального A22-6821-7, выпущенного в сентябре 1968 года). Благодаря практически полной совместимости «снизу вверх» можно воспользоваться и документацией на Систему 370, в том числе выполненным мной переводом последней редакции соответствующего документа IBM (GA22-7000-10, сентябрь 1987 года). Здесь я остановлюсь лишь на важнейших элементах архитектуры, знание которых требуется для лучшего понимания устройства процессора любой реализующей её машины.
Память
Вся доступная программисту память является оперативной — программно доступной постоянной памяти архитектура не предусматривает в принципе. Она начинается с нулевого адреса и является непрерывной. IBM для обозначения ОЗУ вместо привычного термина random access memory (RAM) использовала и продолжает использовать термин main storage, обычно переводимый на русский язык как «основная память» (ОП). В дальнейшем для обозначения памяти, видимой программисту, будет использоваться именно этот термин, а термин «оперативная память» или ОЗУ будет применяться по отношению к физической памяти, которая не всегда в полном объёме доступна программисту (например, у ЕС-1020 ОЗУ используется для хранения не только информации, доступной программисту, но и некоторых «внутримашинных» данных, т. е. ОП в ней является лишь частью полного объёма ОЗУ).
Как уже говорилось, информация в памяти адресуется побайтово. При хранении многобайтовых величин (16-разрядных полуслов, 32-разрядных слов и 64-битных двойных слов) используется порядок «старший-младший»: самый старший байт хранится по наименьшему адресу (в архитектуре IA-32, чаще называемой x86, и в большинстве других современных архитектур принят порядок «младший-старший»; в архитектуре ARM допустимы оба порядка, хотя «младший-старший» используется намного чаще). Многобайтовое поле фиксированной длины в памяти должно выравниваться на его естественную границу, т. е. адрес этого поля должен быть кратен размеру поля в байтах (2, 4 или 8 байтов; в Системе 370 это требование ослабили — там выровненными должны быть лишь управляющие поля и операнды некоторых специальных команд, а все остальные данные могут располагаться по произвольным адресам — но ценой возможного падения производительности). Помимо данных фиксированной длины, могут обрабатываться байтовые поля переменной длины, содержащие либо произвольную «логическую» или символьную информацию (длина от 1 до 256 байтов включительно), либо двоично-кодированные десятичные числа (от 1 до 16 байтов, т. е. от 1 до 31 десятичной цифры плюс знак).
Непривычной особенностью архитектуры является нумерация битов, начиная со старшего: номер 0 всегда имеет старший бит величины (например, байта), а не младший.
Адрес памяти является 24-разрядным, что ограничивает адресное пространство 16 Мбайтами (огромная величина для 1960-х годов; машины с таким объёмом памяти стали появляться в сколько-нибудь ощутимых количествах лишь во второй половине 1970-х); при размещении адреса в 32-разрядном машинном слове он занимает три младших байта, а старший байт игнорируется.
Поддержка виртуальной памяти отсутствует (она не сразу появилась даже в Системе 370, а в Системе 360 была реализована, кажется, лишь в одной полуэкспериментальной модели: в IBM считали, что она не нужна, но потребители в конце концов переубедили производителя). Аппаратная защита памяти не является обязательной, но по факту присутствовала почти во всех моделях. В ЕС-1020 технически она может отсутствовать, но мне неизвестно, выпускались ли машины без защиты; во всех средних и старших моделях ЕС ЭВМ она де-факто является обязательной.
С точки зрения программиста защита организуется следующим образом.
Выполняемая процессором программа имеет свой ключ доступа — 4-битовую величину, хранящуюся вместе с другой управляющей информацией в слове состояния программы (PSW, см. ниже). Аналогичным образом, у каждой выполняемой программы канала (о них будет сказано позже) также имеется свой ключ доступа, задаваемый при запуске этой программы.

С каждым блоком ОП размером 2 Кбайта связывается свой 5-битный ключ защиты, включающий 4 бита доступа ACC и один бит защиты от выборки F. Попытка записи информации в ОП разрешается, если ключ доступа программы процессора или канала совпадает с битами ACC в ключе защиты адресуемого блока либо если ключ доступа равен нулю. Попытка считывания информации разрешается, если в ключе блока памяти сброшен бит F, либо если ключ доступа совпадает с битами ACC ключа защиты, либо если ключ доступа равен нулю. Таким образом, нулевое значение ключа доступа де-факто отключает защиту, поэтому оно используется только для нужд операционной системы. В некоторых моделях IBM предусматривалась защита только от записи: бит F в ключах памяти отсутствовал, поэтому любые обращения на считывание всегда разрешены; в советских машинах, насколько мне известно, этот бит присутствовал всегда. Замечу, что этот механизм защиты с небольшими расширениями и модификациями используется мэйнфреймами IBM и по сей день.
Младшие 4 Кбайта ОП отведены под хранение управляющей информации, расположенной по строго определённым адресам и используемой для организации ввода-вывода и обработки прерываний (подробнее см. ниже). Очевидно, что в многопроцессорной ЭВМ каждый процессор должен иметь собственную область нижних адресов; в то же время, вся память должна быть доступна всем процессорам без ограничений. Это достигается использованием механизма префиксации.
Программа оперирует так называемыми реальными адресами — они хранятся в регистрах, вычисляются при определении адресов операндов и т. д. Для доступа к памяти реальные адреса преобразуются в абсолютные адреса, для чего у каждого процессора многопроцессорной системы имеется собственный 12-разрядный префикс. Правила преобразования просты:
если старшие 12 разрядов реального адреса равны нулю, они заменяются на значение префикса, чем достигается «перемещение» нижних 4 Кбайт реального адресного пространства данного процессора в произвольный 4-Кбайтовый блок абсолютного адресного пространства ОП;
если старшие 12 разрядов реального адреса равны префиксу, они заменяются нулями, чем достигается возможность обращения процессора к блоку с нулевым абсолютным адресом;
во всех остальных случаях абсолютный адрес равен реальному.
Значение префикса в Системе 360 задаётся переключателями на пульте управления до загрузки системы; в Системе 370 и последующих версиях архитектуры оно задаётся программно с помощью специальной привилегированной команды.
Машины, не поддерживающие многопроцессорную работу (ЕС-1020, как и любая младшая модель, входит в их число), механизмом префиксации не располагают.
Заметим, что каналы ввода-вывода оперируют напрямую абсолютными адресами, поэтому префиксация на них не действует, не считая момента запуска операции и обработки прерываний ввода-вывода, где ведущую роль играет не канал, а процессор.
Программно доступные регистры
В распоряжении программиста имеется 16 32-разрядных общих регистров (general registers). В отличие от, скажем, микропроцессоров Intel 8086 и 8088 (на последнем была построена IBM PC), эти регистры действительно являются почти равноправными, за исключением следующих особенностей:
в командах умножения, деления и некоторых сдвигов, где имеется 64-разрядный операнд или результат, его старшая половина должна находиться в регистре с чётным номером, а младшая — в следующем за ним регистре с нечётным номером;
при формировании адресов операндов в памяти содержимое регистра 0 считается нулевым независимо от его реального содержимого (в обычных операциях обработки данных он выступает наравне с остальными регистрами);
в трёх специфических командах неявно используется строго определённый общий регистр, все остальные команды задают используемые регистры явным образом без каких-либо ограничений, кроме указанных выше.
Кроме общих регистров, имеется четыре 64-разрядных регистра с плавающей запятой (float-point registers). В случае использования 32-разрядных вещественных операндов они занимают только старшую половину регистра, содержимое младшей половины игнорируется. Регистры с плавающей запятой имеют номера 0, 2, 4 и 6 — это одна из странностей архитектуры (подобная нумерация 64-разрядных регистров теоретически позволяет слегка упростить аппаратуру адресации регистров, учитывая, что ей приходится обеспечивать обращение и к 32-, и к 64-разрядным регистрам; на практике особых преимуществ это не даёт).
Состояние процессора и адрес следующей выполняемой команды хранятся вместе в 64-разрядном регистре, называемом словом состояния программы PSW (program status word). Назначение его разрядов следующее:

биты 0–6 — маски прерываний от каналов ввода-вывода с соответствующими номерами (нулевое значение маски запрещает прерывания). Если машина имеет менее семи каналов, в качестве масок используются только самые левые (старшие) биты; если каналов больше семи, бит 6 (IO) является маской для всех каналов, начиная с имеющего номер 6;
бит 7 (EX) — маска внешних прерываний;
биты 8–11 — ключ доступа процессора;
бит 12 (A) — задаёт кодировку символов, влияющую на выполнение некоторых команд: 0 для EBCDIC (в СССР был дополнен русскими буквами и получил название ДКОИ), 1 для ASCII;
бит 13 (M) — маска прерываний от схем контроля машины;
бит 14 (W) — бит ожидания: когда он установлен, процессор прекращает выполнение команд до тех пор, пока не поступит разрешённый запрос какого-либо прерывания;
бит 15 (P) — состояние «задача» (problem state): когда он равен нулю, процессор находится в состоянии супервизора и может выполнять любые команды, когда равен единице — только непривилегированные;
биты 16:31 — код прерывания. В собственно PSW это поле никак не используется, информация в нём появляется лишь в значении PSW, записываемом в память при некоторых прерываниях (см. ниже);
биты 32:33 (ILC) — двухбитовый код длины команды (см. ниже);
биты 34:35 (CC) — двухбитовый код условия (см. ниже);
биты 36:39 — так называемая маска программы, включающая четыре бита масок прерываний, которые могут возникать при выполнении некоторых команд (например, маска целочисленного переполнения). В отличие от остальных битов, доступных лишь привилегированной программе (супервизору), маска программы может быть изменена прикладной программой с помощью специальной команды, что даёт возможность программе разрешать или запрещать эти прерывания;
биты 40:63 — 24-разрядный адрес следующей команды.
В порядке небольшого «лирического отступления» замечу, что в Системе 370 для расширения возможностей архитектуры и одновременно для сохранения возможно более полной совместимости с Системой 360 отказались от поддержки не пользовавшейся популярностью у самой IBM и её покупателей кодировки ASCII (кто ж в конце 1960-х знал, что именно она, а отнюдь не EBCDIC, станет стандартом и сохранится даже в составе Юникода в кодировке UTF-8). Бит 12 в PSW этих машин стал определять режим работы: когда он сброшен, процессор работает в режиме основного управления (BC), совместимом с Системой 360, когда установлен — в режиме расширенного управления (EC), введённом в Системе 370 для поддержки её новых возможностей. В режиме EC формат PSW в значительной степени изменяется, а управление многими функциями машины переносится в управляющие регистры, отсутствовавшие в Системе 360. Таким образом, совершенно стопроцентной совместимости «снизу вверх» между Системой 360 и последующими поколениями архитектуры нет, но это отступление — единственное, затрагивающее переносимость прикладных программ (впрочем, таковых, использующих кодировку ASCII, вероятно, практически не было, почему IBM и пожертвовала этим режимом).
Система команд
Команды имеют длину 2, 4 или 6 байтов (одно, два или три полуслова) и всегда выравниваются на границу полуслова. По этой причине в нормальных ситуациях адрес команды в PSW имеет младший бит, равный нулю. Данное свойство используется операционными системами: при возникновении какой-либо критической ошибки, делающей невозможным продолжение работы, система переводит процессор в состояние ожидания с запрещёнными прерываниями, загружая при этом в PSW нечётный адрес команды, служащий в такой ситуации кодом ошибки.
В отличие от, скажем, архитектуры IA-32, определить длину кода команды в Системе 360 и всех последующих версиях архитектуры очень просто: она задаётся двумя старшими битами старшего байта кода команды: 00 — одно полуслово, 01 или 10 — два полуслова, 11 — три полуслова. Благодаря этому свойству выборка и анализ команды намного проще, чем во многих других архитектурах.
В Системе 360 выделяется пять форматов команд: RR, RX, RS, SI и SS.

Формат RR является единственным, занимающим одно полуслово, и используется для команд «регистр-регистр». Старший его байт содержит код операции (два старших бита всегда равны нулю), младший разделён на две половины, в каждой из которых размещается номер регистра — поля R1 и R2 (заметим, что эти обозначения указывают именно поля кода команды, а не задают регистры с номерами 1 и 2). Например, команда И, выполняющая операцию «логическое И» между двумя общими регистрами 5 (первый операнд и приёмник результата) и 10 (второй операнд) записывается на языке ассемблера как NR 5,10 и имеет шестнадцатеричный код 145A.

Формат RX имеет длину два полуслова и является наиболее широко используемым для команд «регистр-память». Старший его байт содержит код операции (два старших бита содержат 01), биты 0:3 следующего байта — номер регистра, содержащего первый операнд и обычно являющегося приёмником результата (R1), биты 4:7 этого байта — номер индексного регистра (X2) для вычисления адреса второго операнда, старший полубайт третьего байта — номер базового регистра (B2), младший полубайт третьего байта и весь четвёртый байт — 12-разрядное смещение (D2). При вычислении адреса операнда процессор складывает между собой содержимое базового и индексного регистров и добавляет к ним смещение; все значения рассматриваются как числа без знака. Если в качестве базового и/или индексного регистра указан регистр 0, вместо его содержимого используется значение 0. Таким образом, для обращения к первым 4096 байтам памяти регистры можно не использовать, достаточно 12-разрядного смещения; адресация остальной памяти возможна только с помощью регистров. (Аналогичная ситуация имеет место, например, в архитектуре ARM, где нет возможности прямо указать полный адрес памяти.) Заметим, что технически регистры X2 и B2 ничем не отличаются, и используемые для них названия «индексный» и «базовый» являются лишь «логическими».
Форматы RS и SI также занимают два полуслова, но, в отличие от формата RX, их код операции содержит в двух старших битах комбинацию 10.

Формат RS предполагает использование трёх операндов: двух в регистрах (задаются полями R1 и R3) и одного в памяти (задаётся суммой базового адреса и смещения — поля B2 и D2).

Формат SI имеет два операнда: первый располагается в памяти и задаётся полями B1 и D1, а вторым является 8-разрядная константа, являющаяся частью самого кода команды (поле I2).

Команды формата SS состоят из трёх полуслов; два старших бита их кода операции имеют значение 11. Они задают операции «память-память»; к ним относятся, например, команда пересылки строк символов MVC и все команды десятичной арифметики. Код команды содержит адреса двух операндов в памяти (поля B1, D1 и B2, D2) и либо единое поле длины L (значения 0–255 соответствуют длине от 1 до 256 байтов включительно), либо два поля L1 и L2, указывающие длины каждого из операндов (значения 0–15 соответствуют длине от 1 до 16 байтов включительно).
В действительности не все команды в точности соответствуют этим форматам. Например, команда вызова супервизора SVC формально относится к формату RR, но её второй байт содержит не номера двух регистров, а код запрашиваемой функции, т. е. 8-разрядную константу; команды сдвигов относятся к формату RS, но операнд R3 в них вообще не используется, а сумма B2 и D2 задаёт не адрес в памяти, а количество разрядов, на которые необходимо выполнить сдвиг, и т. д. В последующих версиях архитектуры добавилось ещё несколько форматов, но лишь в z/Architecture подобные команды наконец-то «юридически» выделили в отдельные форматы, реально соответствующие их кодированию.
Система команд включает обязательную часть, общую для всех машин, и несколько расширений, наиболее крупными из которых являются наборы команд вещественной арифметики и обработки десятичных чисел. Американские машины включали те или иные наборы в зависимости от модели и требований заказчика; в советских, насколько мне известно, всегда реализовывался полный набор команд Системы 360 (143 команды; в большинстве публикаций указывается, что команд было 144, но это ошибка: вероятно, кто-то ещё в СССР ошибся при их подсчёте или допустил опечатку, а дальше её пошли копировать).
Формат вещественных чисел отличается от современного, определяемого стандартом IEEE 754, хотя сама идея, конечно, та же самая. Главное отличие — мантиссы чисел являются не двоичными, а шестнадцатеричными, поэтому порядок задаёт степень не двойки, а 16, что обеспечивает намного больший диапазон представимых чисел. В то же время точность несколько хуже: во-первых, нет скрытой старшей единицы, а во-вторых, в зависимости от старшей цифры мантиссы ещё до трёх старших битов могут быть равны нулю; таким образом, по сравнению с IEEE 754 теряется от одного до четырёх двоичных разрядов точности. Из любопытных особенностей — наличие команды ПОПОЛАМ (HDR или HER в зависимости от размера числа — 8 или 4 байта), которая делит вещественное число на 2 (для этого нужно выполнять сдвиг мантиссы и иногда корректировать порядок; в IEEE 754 аналогичная операция выполняется уменьшением порядка на единицу без всяких сдвигов). В z/Architecture этот формат называется шестнадцатеричными числами с плавающей запятой; помимо них, в архитектуру были введены десятичные и двоичные вещественные числа — последние полностью соответствуют стандарту IEEE 754.

Десятичные числа в Системе 360 технически являются целыми («юридически» они, как и двоичные целые числа, называются числами с фиксированной запятой) и хранятся только в ОП, а не в регистрах. Для обработки они должны быть представлены в так называемом упакованном формате по две цифры 0–9 в одном байте, лишь младший полубайт самого правого байта (т. е. байта с наибольшим адресом) хранит код знака. В одном числе может быть от одного до 16 байтов включительно, т. е. от одной до 31 десятичной цифры. Все команды обработки десятичных чисел имеют формат SS («память-память»); помимо обычных арифметических операций сюда относятся весьма сложные команды РЕДАКТИРОВАНИЕ (ED) и РЕДАКТИРОВАНИЕ И ОТМЕТКА (EDMK), предназначенные для облегчения преобразования чисел в печатаемый вид по определённому шаблону. Кроме них, имеются две команды УПАКОВКА (PACK) и РАСПАКОВКА (UNPK), преобразующие десятичные числа из зонного формата в упакованный и обратно. В зонном формате в каждом байте находится код одной цифры, занимающий младший полубайт, а в старшем находится код зоны. Для почти всех цифр числа он зависит от выбранной кодировки и равен F для EBCDIC и 3 для ASCII (в соответствии с кодами символов цифр в этих кодировках — F0–F9 и 30–39 соответственно); зона самого правого символа может либо иметь такой же код (в этом случае число считается положительным), либо иметь одно из специальных значений, кодирующих знак. Любопытно, что команды PACK и UNPK относятся не к командам десятичной арифметики, которые в Системе 360 являются необязательными (они стали обязательными лишь в Системе 370), а к основному набору команд, т. е. должны быть реализованы всегда. Ещё одной «хитрой» командой, формально относящейся к основному набору, но реально предназначенной, в первую очередь, для обработки десятичных чисел, является ПЕРЕСЫЛКА СО СДВИГОМ (MVO): она пересылает содержимое заданного количества байтов памяти из одного места в другое, параллельно сдвигая его на полбайта, что позволяет организовать умножение или деление десятичного числа на 10 без использования очень «тяжёлой» команды ДЕЛЕНИЕ ДЕСЯТИЧНОЕ (DP).

Заметим, что выбор кодировки EBCDIC или ASCII в PSW влияет только на коды знаков и зон; все остальные операции, выполняемые процессором, никак от этого режима не зависят.
В отличие от большинства более современных архитектур, результат выполнения некоторой операции, например, сложения или сравнения, отражается не четырьмя флажками признаков (как правило, носящих обозначения N, Z, V, C, но в IA-32 — SF, ZF, OF и CF), а двухбитовым кодом условия CC. Правила его установки зависят от команды, а невозможность отразить сразу все возможные результаты выполнения арифметических операций привела к тому, что в системе команд имеются отдельные команды для сложения или вычитания целых чисел со знаком и без знака. Например, знаковое сложение «регистр-память» задаётся командой A (формат RX), которая устанавливает код результата равным 00, если получен нулевой результат, 01 для отрицательного результата, 10 для положительного результата и 11 для переполнения. Аналогичное беззнаковое сложение выполняется командой AL; собственно результат в регистре будет таким же, как и для команды A, но правила установки кода условия отличаются: 00 указывает на нулевой результат при отсутствии переноса, 01 — на ненулевой результат при отсутствии переноса, 10 — на нулевой результат и наличие переноса, 11 — на ненулевой результат и наличие переноса. Достоинством архитектуры такой способ индикации свойств результата назвать трудно, но и большим недостатком он тоже не является. Кроме того, иногда этот способ даже удобен: команды условного перехода BC и BCR вместо обычного поля R1 имеют поле M1, содержащее четыре бита маски, соответствующие четырём возможным значениям кода условия, и выполняют переход, если бит маски, соответствующий фактическому значению кода условия, установлен; благодаря этому можно, например, одной выполнить переход, если получен положительный или отрицательный результат, но не нуль и не переполнение.
Значительно большим недостатком архитектуры является отсутствие стека — причём он так и не появился даже в z/Architecture (тот стек, что появился в поздних моделях Системы 370, имеет совершенно другие функции и для обычного вызова подпрограмм и сохранения регистров использоваться не может). Для вызова подпрограммы используются команды BAL и BALR, заносящие адрес возврата и некоторую другую информацию в общий регистр, заданный полем R1 (адрес перехода, как и в командах BC и BCR, задаётся либо суммой X2, B2, D2, либо содержимым общего регистра R2; если в качестве последнего указан нулевой регистр, переход никогда не выполняется, поэтому на нулевой адрес можно перейти только командой формата RX). Для сохранения содержимого регистров, в том числе и хранящего адрес возврата, и размещения временных операндов в Системе 360 требуются дополнительные усилия — особенно в случае, если необходимо обеспечить повторную входимость (реентерабельность) подпрограммы. Впрочем, обсуждение используемых для этого программных приёмов выходит за рамки данной статьи.
Прерывания
В зависимости от причины возникновения все прерывания делятся на пять категорий:
прерывания от схем контроля машины;
прерывание по вызову супервизора;
прерывания ввода-вывода;
внешние прерывания;
программные прерывания.
Прерывания от схем контроля возникают при обнаружении какой-либо аппаратной проблемы (не обязательно ошибки в полном смысле слова; так, это прерывание может возникнуть при отказе одного из вентиляторов, что не приведёт немедленно к неправильной работе машины, но требует внимания обслуживающего персонала). Общая идея заключается в том, что операционная система, получив сведения об ошибке, может уведомить персонал и предпринять меры для минимизации последствий сбоя. Например, если вышел из строя какой-то блок памяти, система может пометить соответствующую область как непригодную для использования, а пострадавшую задачу либо аварийно завершить с соответствующим уведомлением, либо перезапустить с контрольной точки. В силу своей специфики эта категория прерываний крайне сильно зависит от конкретной модели машины; архитектура определяет лишь некоторые общие принципы и концепции их обработки. Все остальные категории прерываний от модели ЭВМ не зависят (за исключением того, что не все прерывания могут возникнуть на конкретной модели: очевидно, что для этого должны поддерживаться соответствующие технические средства).
Прерывание по вызову супервизора возникает при выполнении команды SVC, дающей возможность прикладной программе обратиться к услугам операционной системы (супервизора).
Прерывания ввода-вывода возникают по ходу выполнения канальных программ или при их завершении, а также в случае, когда внешнее устройство по своей инициативе хочет привлечь внимание программы. Подробнее о них будет сказано ниже.
Внешние прерывания возникают в связи с какими-то внешними по отношению к процессору обстоятельствами, не связанными при этом с устройствами ввода-вывода. Применительно к Системе 360 причинами таких прерываний являются нажатие кнопки прерывания на пульте управления машиной, истечение интервала времени, отсчитываемого интервальным таймером (см. ниже), и события, связанные с так называемым интерфейсом прямого управления (см. ниже).
Программные прерывания возникают по причинам, непосредственно связанным с выполнением команд; можно в первом приближении считать, что их причиной являются ошибки в программе. Заметим, что если общим названием для прерываний любых видов в документации IBM служит слово interruption, то для причин программных прерываний используется термин exception (но программные прерывания в целом называются program interruption). В современной русскоязычной литературе exception переводится буквально — «исключение», однако в советской литературе использовалось словосочетание «особый случай»; лично я предпочитаю использовать его из-за многозначности слова «исключение». Например, при попытке программы обратиться к отсутствующей области памяти распознаётся особый случай адресации (addressing exception), а при попытке обратиться к присутствующей, но защищённой ключом области, к которой у программы нет доступа, — особый случай защиты (protection exception); в обоих случаях немедленно возникает программное прерывание. Всего в Системе 360 насчитывается 15 различных особых случаев, приводящих к программным прерываниям.
Начиная с Системы 370, добавилась шестая категория прерываний — повторного пуска. Оно используется, главным образом, для стандартной организации запуска дополнительных процессоров многопроцессорной системы (в Системе 360 многопроцессорность проработана слабо и не определяется полностью архитектурой — часть её аспектов зависит от реализации).
С точки зрения программиста, все виды прерываний обрабатываются аппаратурой по единой схеме:
производится сериализация (serialization) или, как её называли в СССР, временная отмена совмещений: процессор завершает все ранее начатые операции, записывает в память все изменённые им ячейки и очищает кэши, если таковые имеются, и т. д. Исключением являются прерывания от схем контроля, если причина прерывания не даёт возможности завершить выполнявшиеся к моменту его возникновения операции сколько-нибудь нормально — в такой ситуации прерывание происходит немедленно, а состояние процессора и памяти может быть в той или иной степени неопределённым. Для младших, а обычно и средних моделей ЭВМ этот шаг является неактуальным из-за строго последовательного характера их работы и отсутствия кэшей;
по строго определённому адресу, зависящему от категории прерывания, производится сохранение значения PSW на момент возникновения прерывания — так называемого старого PSW; в его составе для большинства прерываний запоминается код прерывания, позволяющий уточнить причину его возникновения (например, для прерывания ввода-вывода кодом прерывания будет адрес канала и устройства ввода-вывода, а для внешнего прерывания — битовая маска, показывающая, какие источники запросили прерывание). Важными элементами сохранённого старого PSW являются адрес команды и код длины команды (ILC): в зависимости от причины прерывания адрес указывает либо на команду, вызвавшую прерывание, либо на следующую за ней команду, а ILC даёт системе возможность при необходимости определить адрес команды, вызвавшей прерывание;
для некоторых прерываний производится сохранение дополнительной информации;
по строго определённому адресу производится считывание нового PSW;
снова выполняется сериализация;
процессор возобновляет работу под управлением нового PSW.
Таймер
Так называемый интервальный таймер является единственным средством отсчёта времени в Системе 360. Формально он не обязателен, но во всех советских машинах присутствует.
С точки зрения программиста, интервальный таймер — это слово в основной памяти по шестнадцатеричному адресу 50 (заметим, что в документации IBM и её советских переводах было принято указывать десятичные адреса ячеек памяти, что для обслуживающего персонала было весьма неудобно), значение которого уменьшается с определённой скоростью. Хотя фактическая частота обновления значения таймера и величина, на которую он уменьшается при каждом обновлении, определяется реализацией, темп уменьшения должен соответствовать вычитанию из значения таймера шестнадцатеричной величины 100 (т. е. вычитанию единицы из бита 23) с частотой 300 раз в секунду. Если при очередном вычитании старший (нулевой) бит таймера изменил значение из 0 в 1, формируется запрос внешнего прерывания (но запись отрицательного значения в память по адресу 50 не вызывает формирование запроса прерывания — он возникает лишь в результате получения отрицательного числа из неотрицательного в процессе уменьшения значения таймера). Если прерывания запрещены, запрос сохраняется в ожидании обработки. Полный цикл таймера занимает примерно 15,5 часов.
Столь странный, на первый взгляд, способ изменения значения таймера вызван следующими обстоятельствами:
разные модели могут иметь производительность, различающуюся в десятки или сотни раз, поэтому слишком частое обновление таймера для медленной машины может быть затруднительным; в то же время высокопроизводительная модель может обеспечивать более точный отсчёт времени;
обеспечение одинаковой «логической» скорости изменения таймера даёт возможность программе не учитывать фактическую скорость его обновления: интервалы, задаваемые одним и тем же числом на разных моделях, будут идентичными в реальном выражении (в пределах фактической точности таймеров этих моделей);
выбор эталонной скорости обновления 300 раз в секунду облегчает реализацию таймера, опирающегося на частоту промышленной сети электропитания (60 Гц в США и некоторых других странах, 50 Гц в большинстве стран мира, включая СССР), — в те годы именно электросеть была наиболее доступным источником более-менее точного времени.
Таймер может быть отключён переключателем на пульте управления, что обычно используется во время выполнения тестовых программ.
Интервальный таймер имеет два принципиальных недостатка:
невысокая точность, вполне достаточная для систем пакетной обработки данных (IBM рассматривала свои машины, в первую очередь, именно в этом качестве, — отсюда, в частности, её нелюбовь к виртуальной памяти), но слишком малая для некоторых других применений;
возможность потери точности (пропуска обновлений) при интенсивном вводе-выводе: каналы имеют безусловный приоритет при доступе к ОП, поэтому выполнение длительной операции ввода-вывода с быстрым устройством может привести к тому, что процессор не сможет обратиться к памяти в течение достаточно долгого промежутка времени.
По этим причинам в Системе 370 интервальный таймер был объявлен устаревшим, но поддерживался для совместимости с ОС, рассчитанными на Систему 360 (архитектура получила альтернативные средства отсчёта времени, которые были доступны для новых версий ОС), а позднее — упразднён.
Интерфейс прямого управления
Интерфейс прямого управления является необязательным средством, хотя во всех советских ЭВМ он, кажется, имеется (во всяком случае, он присутствует во всех машинах, появившихся в 1970-х и начале 1980-х годов). Его назначение — возможность записи привилегированной командой WRD (ПРЯМАЯ ЗАПИСЬ) или считывания привилегированной командой RDD (ПРЯМОЕ ЧТЕНИЕ) одного байта информации и сопровождающих его синхроимпульсов. С каким именно оборудованием выполняется связь посредством данного интерфейса, зависит от пользователя; у нас в стране, похоже, наиболее частым, если не единственным его практическим применением являлась организация межпроцессорного или межмашинного взаимодействия (что само по себе встречалось в те годы очень нечасто). В частности, он использовался для построения многопроцессорных и многомашинных комплексов на базе ЕС-1030 и ЕС-1033: с его помощью один процессор мог выполнить сброс или перезапуск другого процессора и т. д. На ЕС-1020 можно было построить многомашинный комплекс (как с другой ЕС-1020, так и с более мощной машиной — подобные эксперименты имели место; их задачей было, по меньшей мере, наработать опыт построения гетерогенных систем, необходимых для решения «тяжёлых» задач, которые не могла тянуть одиночная ЭВМ, — скажем, систем резервирования авиа- и железнодорожных билетов в масштабе всей страны). Однако способы сопряжения машин через интерфейс прямого управления не были стандартизированы на уровне архитектуры, являясь, по сути, её расширениями для конкретных моделей вычислительных машин; стандартизирован был лишь сам интерфейс.
Описание принципов работы интерфейса прямого управления для данной серии публикаций не требуется; никакого влияния на внутреннее устройство и работу процессора он, по большому счёту, не оказывает (кроме, разумеется, наличия регистров, через которые производится взаимодействие с ним). Описание этого интерфейса приведено в документе IBM A22-6845-2 «Direct Control and External Interrupt Features Original Equipment Manufacturers' Information».
Заметим, что интерфейс прямого управления является весьма… странным, а связанная с ним команда RDD является единственной, способной намертво «повесить» совершенно исправный процессор. Неудивительно, что в Системе 370 он был объявлен устаревшим, а позже — полностью упразднён; для межпроцессорного взаимодействия в рамках Системы 370 были разработаны новые средства (главным образом, команда СИГНАЛ ПРОЦЕССОРУ (SIGP) и ряд новых внешних прерываний), применяемые с определёнными дополнениями и изменениями и в современных машинах.
В ЕС-1020 сам интерфейс прямого управления имеется, однако многопроцессорная работа невозможна, что для младшей модели совершенно оправдано: она должна иметь минимальную стоимость.
Ввод-вывод
Организация ввода-вывода в Системе 360 кардинально отличается от любых современных (кроме z/Architecture, конечно) и подавляющего большинства старых архитектур. Подробное знакомство с ней необходимо только при обсуждении работы каналов, поэтому здесь приводится лишь самая основная информация, позволяющая понять общую идею выполнения операций ввода-вывода на этих машинах.
Все операции ввода-вывода производятся путём выполнения так называемых канальных программ посредством каналов ввода-вывода (I/O channels), к которым через стандартный интерфейс ввода-вывода подключаются устройства управления внешними устройствами (control units; в СССР для их обозначения обычно использовалась аббревиатура УВУ), а к ним — собственно внешние устройства (ВУ). В некоторых случаях УВУ и ВУ технически являются одним целым и для пользователя неразличимы; к таким устройствам относятся, например, принтеры, устройства ввода и вывода перфокарт и т. д. Другие устройства, наоборот, подключаются к физически отдельному УВУ — это, например, накопители на магнитных дисках (НМД, попросту говоря, дисководы) и магнитных лентах (НМЛ): к каждому контроллеру обычно можно было подключить, как правило, до восьми устройств, используя специфический для данного контроллера интерфейс, называемый малым интерфейсом (чтобы отличить его от интерфейса ввода-вывода, соединяющего УВУ с каналами и идентичного для любых типов УВУ).
У каждого процессора имеется свой набор каналов ввода-вывода; конкретно у ЕС-1020 их три штуки: байт-мультиплексный канал, имеющий номер 0, и два селекторных канала (1 и 2). К каждому из каналов логически можно подключить до 256 ВУ (количество реально подключаемых устройств ограничивается электрическими параметрами и максимальной длиной интерфейса и, как правило, не должно превышать восьми УВУ). Полный адрес устройства, используемый в программах и сохраняемый при прерываниях ввода-вывода, содержит в старшем байте номер канала, а в младшем — номер устройства на канале. УВУ своего адреса не имеют и в большинстве случаев для программиста неотличимы от подключённых к нему ВУ.
Байт-мультиплексный (обычно называемый просто мультиплексным) канал предназначен для подключения медленных и среднескоростных устройств — принтеров, пультовых пишущих машинок, модемов и т. д.; селекторный канал предназначен для подключения высокоскоростных устройств — главным образом, НМД и НМЛ. Интерфейс ввода-вывода в любом случае остаётся идентичным, поэтому любое устройство, обычно подключаемое к мультиплексному каналу, можно подключить и к селекторному; обратное подключение, как правило, невозможно из-за низкой пропускной способности мультиплексного канала.
Начав выполнение канальной программы для некоторого устройства, селекторный канал остаётся логически связанным с этим устройством до самого её завершения и не может обслуживать другие устройства. Мультиплексный канал может работать в монопольном и мультиплексном режимах. В мультиплексном режиме канал логически соединяется с устройством для запуска очередной операции, а затем отсоединяется от него и может соединяться с другим устройством. Когда устройство готово принять или передать один или несколько байтов информации, оно по интерфейсу ввода-вывода извещает канал о своём желании, и тот при первой возможности опять подключается к устройству, выполняет обмен данными и вновь отключается. Однако, если устройство не освобождает канал очень быстро сразу после запуска операции и, возможно, передачи небольшого количества данных, канал переходит в монопольный режим, в котором он подобен селекторному каналу, отличаясь обычно лишь намного меньшей скоростью обмена данными (что объясняется чисто микропрограммной реализацией функций мультиплексного канала почти во всех моделях — в отличие от смешанного аппаратно-микропрограммного управления у селекторных каналов).
Процессор управляет вводом-выводом, используя четыре привилегированные команды, из которых важнейшей является ЗАПУСК ВВОДА-ВЫВОДА (SIO). Формально она относится к формату SI, операнд I1 не используется и игнорируется (в Системе 370 эта команда была переведена во вновь образованный формат S, а бывший операнд I1 стал вторым байтом кода операции, благодаря чему у поздних моделей появилась пара разновидностей этой команды), а операнд B2, D2 задаёт не адрес памяти, а адрес внешнего устройства (номер канала и номер устройства), на котором надо начать операцию.

Выполняя команду SIO, процессор считывает из памяти по фиксированному шестнадцатеричному адресу 48 так называемое адресное слово канала (CAW; в советской литературе обычно используется русская аббревиатура АСК), после чего извещает заданный канал о запуске операции, передавая ему номер устройства и содержимое CAW. В последнем содержатся ключ доступа к памяти, назначаемый запускаемой канальной программе (все доступы к памяти канал будет выполнять, используя этот ключ, благодаря чему защита памяти распространяется и на операции ввода-вывода), и адрес командного слова канала (CCW или КСК), с которого начинается канальная программа.
Параллельно может выполняться несколько канальных программ: по одной канальной программе способен выполнять каждый из селекторных каналов, а каждый мультиплексный — теоретически, до 256 одновременно. Фактически число одновременно выполняемых мультиплексным каналом канальных программ зависит от числа реализованных в нём так называемых подканалов — по сути, отдельных областей в управляющей памяти канала, где хранится вся необходимая информация о канальной программе; селекторный канал можно рассматривать как имеющий только один подканал.

CCW содержит код операции ввода-вывода (один байт, из которых для канала роль играют несколько младших битов), адрес буфера ввода-вывода и его размер, а также ряд флагов, дополнительно управляющих операцией. Канал, считав из памяти первое CCW, производит выборку устройства, передаёт ему код операции ввода-вывода из CCW и при подтверждении успешного запуска сообщает об этом процессору, после чего последний завершает команду SIO с установкой кода условия 0 и продолжает выполнение программы; весь дальнейший ввод-вывод выполняется исключительно силами канала без привлечения процессора. Если в вышеописанном процессе возникли какие-то ошибки (устройство отсутствует или выключено, канал занят другой операцией, в CAW или CCW есть ошибки и т. д.), канал извещает о проблеме процессор, и тот завершает команду SIO с кодом условия 1, 2 или 3 в зависимости от причины; программа, проанализировав код условия после SIO, может определить, была ли запущена операция и какие возникли ошибки.
С точки зрения канала, код операции ввода-вывода, содержащийся в CCW, определяет направление передачи данных: ввод или вывод; для ВУ тот же код точно определяет операцию и её разновидность, которую необходимо выполнить. Например, перфокарточное устройство ввода может считать перфокарту, перекодируя пробивки из перфокарточного кода в EBCDIC, а может просто передать пробивки в виде массива битов, чтобы программа в дальнейшем сама разбиралась, что на перфокарте закодировано; этим операциям соответствуют разные коды в CCW, но для канала они определяют одну и ту же операцию — ввод.
Флажки в CCW предоставляют дополнительные возможности управления операцией. Например, один из них блокирует индикацию неправильной длины, т. е. заставляет канал игнорировать случай, когда устройство хочет принять или передать больше байтов, чем содержится в буфере. Так, если программа хочет считать с перфокарты только первые 20 байтов, она должна не только установить размер буфера равным 20, но и указать в CCW этот флаг: перфокарта содержит 80 байтов и не может быть считана лишь частично, поэтому устройство ввода попытается передать каналу всё содержимое перфокарты; если флаг подавления индикации неправильной длины не установить, выполнение канальной программы будет завершено из-за возникновения ошибки.
Флаг цепочки данных позволяет использовать несколько расположенных в памяти друг за другом CCW в рамках одной операции ввода или вывода. Первое CCW определяет операцию и задаёт адрес и размер первой части буфера, каждое последующее CCW определяет адрес и размер следующей части буфера (поле кода операции во всех CCW, кроме первого, игнорируется). Благодаря этому информация, размещённая на устройстве единым блоком, может считываться в несмежные участки ОП (или наоборот, собираться для записи из несмежных участков).
Флажок цепочки команд позволяет выполнить одну за другой несколько операций ввода-вывода. Когда устройство извещает канал о завершении операции (в официальной советской терминологии эта индикация именовалась «конец работы устройства», однако неофициально почти всегда вместо этого длинного термина использовался более короткий — «устройство кончило») и при этом не обнаружено каких-либо ошибок, а в CCW установлен флаг цепочки команд, канал выбирает из памяти следующее CCW и сразу инициирует новую операцию. Именно таким путём, например, выполняются все основные операции с магнитными дисками и барабанами: первое CCW содержит команду установки дискового адреса (с точки зрения канала, эта операция выполняет запись нескольких управляющих байтов на устройство — они содержат номер цилиндра, номер головки и другую информацию, необходимую НМД, но безразличную каналу), а следующее за ним — собственно операцию считывания или записи блока данных.
После завершения последней операции в цепочке или при возникновении ошибки, прерывающей выполнение канальной программы, канал формирует запрос прерывания. Когда процессор принимает этот запрос, вместе с обычным сохранением старого и выборкой нового PSW производится запись адреса устройства, с которым связано прерывание (в составе старого PSW), и слова состояния канала (CSW), содержащего информацию об условиях завершения операции. В частности, в его состав входят байты состояния канала и устройства, отражающие наличие тех или иных ошибок или специфических случаев.

Заметим, что операции ввода-вывода с точки зрения и процессора, и канала выполняются абсолютно идентично с любыми внешними устройствами, причём процессор никак в них не участвует, не считая запуска канальной программы и обработки прерываний по её завершении. Это сильно упрощает программирование ввода-вывода, разгружает процессор от рутинных операций по приёму и передаче данных с любыми устройствами, а устройства избавляет от необходимости напрямую взаимодействовать с памятью. Начиная с Системы 370-XA, ряд технических моментов ввода-вывода был пересмотрен, из-за чего была утрачена программная совместимость с Системами 360 и 370 на уровне системного кода (поменялся набор команд ввода-вывода, чтобы упростить создание многопроцессорных систем и увеличить пропускную способность подсистемы ввода-вывода); позднее вместо классического интерфейса ввода-вывода появились новые, включая оптоволоконные линии передачи данных, однако идеологически принципы организации ввода-вывода остаются практически неизменными, а старые устройства можно подключить к новейшей машине, используя специально для этого предназначенные адаптеры интерфейсов ввода-вывода. В общем, прочитать перфокарты современный мэйнфрейм z/Architecture, работающий под управлением современной ОС, вполне способен; главная сложность в наши дни — найти исправное устройство ввода с перфокарт.
Вместе с тем, нельзя не отметить, что такая система ввода-вывода менее гибкая, чем привычное отображение регистров устройств на адресное пространство и прямое их программирование процессором. Поэтому, прекрасно справляясь с обработкой гигантских объёмов информации, мэйнфреймы плохо подходят для задач реального времени: все «360 градусов» задач они покрыть не в состоянии.
Все младшие и часть средних моделей не имели физически отдельных каналов ввода-вывода, и для выполнения обмена с устройствами привлекалось оборудование процессора. Часть средних моделей и все старшие имели физически отдельные каналы, поэтому операции ввода-вывода в них не тормозили работу процессора (при условии, что каналу и процессору не требуется доступ к памяти в один и тот же момент времени — в этом случае приоритетом пользуется запрос канала, а процессор вынужден какое-то время ждать). Для программиста, однако, эти различия незаметны.
Начальная загрузка программы
Как уже упоминалось, вся программно видимая память является оперативной — ПЗУ отсутствует в принципе; соответственно, Система 360 не может иметь никакого аналога, скажем, BIOS. С точки зрения программиста, начальная загрузка программы (IPL, initial program loading) осуществляется чисто аппаратно. Для этого на пульте управления набирается адрес устройства, с которого нужно выполнить загрузку, и нажимается кнопка загрузки. После этого процессор выполняет сброс всего оборудования и начинает загрузку.
Технически загрузка представляет собой обычное выполнение канальной программы на заданном устройстве ввода-вывода, однако CAW и первое CCW имитируются: CAW задаёт нулевой ключ доступа и нулевой адрес CCW, а CCW указывает операцию чтения с нулевыми битами модификации операции (так называемое основное чтение), нулевым адресом буфера ввода, длиной буфера 24 байта и установленными флагами подавления индикации неправильной длины и цепочки команд.
Прочитав запрошенные 24 байта, канал благодаря заданной цепочке команд переходит к выполнению следующего CCW — оно, как правило, расположено сразу за предыдущим, то есть по адресу 8 (и является вторым из трёх прочитанных двойных слов; в некоторых случаях происходит «перепрыгивание» на третье двойное слово, но не будем углубляться в излишние детали). Это и все последующие CCW продолжают считывание загрузочного кода. В конце концов, когда будет успешно завершено последнее CCW канальной программы, процессор загрузит PSW из нулевой ячейки памяти и приступит под его управлением к выполнению программы. На этом процесс загрузки заканчивается.
Таким образом, благодаря своей унифицированной организации ввода-вывода Система 360 способна выполнить загрузку с любого ВУ, реализующего команду «основное чтение», включая устройства, не существовавшие на момент создания первых машин, причём с точки зрения процессора и канала процесс загрузки никак не зависит от типа устройства.
