Цикл статей, начинаемый этой публикацией, посвящён внутреннему устройству нескольких отечественных моделей ЕС ЭВМ, начиная с самой младшей из них — ЕС-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 (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 способна выполнить загрузку с любого ВУ, реализующего команду «основное чтение», включая устройства, не существовавшие на момент создания первых машин, причём с точки зрения процессора и канала процесс загрузки никак не зависит от типа устройства.
Автор: Иван Савватеев