Процессор ЕС-1020. Оперативная память
Общие сведения
Сначала разберёмся с терминологией. Документация по архитектуре Системы 360, как и всех её потомков, включая современную z/Architecture, для обозначения памяти, которую современные программисты привыкли именовать оперативной, использует словосочетание «main storage». Официальная советская документация на архитектуру ЕС ЭВМ переводит этот термин как «основная память» (ОП) и строго ему следует. Этого же подхода придерживаюсь и я: вся память, доступная программисту для хранения программ и данных, — это основная память (замечу в скобках, что технически она всегда является оперативной, т. е. доступной и для чтения, и для записи: видимую программисту постоянную память архитектура не предусматривает в принципе).
Кроме основной, машина, с точки зрения программиста, имеет ещё один вид памяти — память ключей защиты (ПКЗ). Как я уже писал в статье, освещающей основные особенности архитектуры Системы 360, в ПКЗ хранятся ключи, обеспечивающие защиту основной памяти — по одному ключу на каждые 2 Кбайта ОП.
Когда дело доходит до конкретной аппаратной реализации, нередко оказывается, что видов памяти на самом деле больше. ЕС-1020 в этом смысле является вполне типичным представителем Системы 360 и имеет следующие виды памяти:
основную память объёмом 64, 128 или 256 Кбайт;
локальную память (ЛП) объёмом 256 байт;
мультиплексную память (МП) объёмом 768 или 1536 байт (768-байтная МП используется в машинах, имеющих 64 Кбайта ОП, 1536-байтная — в машинах со 128 или 256 Кбайтами ОП);
память ключей защиты — всегда 128 5-битовых ключей, хотя в зависимости от объёма ОП используются 32, 64 или 128 из них.
Как видим, терминов стало больше, но это не всё. ОП, ЛП и МП в ЕС-1020 физически являются одним и тем же устройством — собственно оперативной памятью (память ключей технически, конечно, тоже является оперативной — хранящиеся в ней ключи меняются по мере необходимости операционной системой, —, но физически является отдельным блоком в составе процессора, а не частью оперативной памяти, выполненной как отдельное устройство). Таким образом, говоря о памяти, надо всегда помнить, о какой именно разновидности идёт речь. К сожалению, имеющаяся литература по ЕС-1020 недостаточно последовательна в использовании терминов: иногда, говоря об оперативной памяти, авторы имеют в виду всю совокупность ОП, ЛП и МП, а иногда — только ОП (в частности, когда речь идёт о памяти, видимой программисту, всегда имеется в виду основная память, — о существовании ЛП и МП программист обычно даже не знает).
Хотя физически ОП, ЛП и МП в ЕС-1020 — это одно и то же, логически это разные виды памяти. ОП, как мы знаем, — это память машины с точки зрения программиста, поэтому в особых комментариях она не нуждается. Локальная память хранит рабочую информацию, используемую процессором во время выполнения команд, а также часть информации, используемой каналами ввода-вывода. В частности, именно в ней хранится содержимое всех регистров общего назначения и регистров с плавающей запятой; таким образом, для программиста регистры процессора и основная память — это совершенно разные вещи, а технически в ЕС-1020 это, в общем-то, одно и то же. Вполне ожидаемо, что такое решение существенно ухудшает производительность, но оно является очень дешёвым — многократно дешевле, чем реализация такого же объёма ЛП с помощью доступных на тот момент микросхем.
Каждый из 256 байтов ЛП имеет своё назначение, представленное в таблице. Доступная литература не даёт полной картины распределения ЛП, о функциях некоторых байтов или отдельных битов можно лишь предполагать. Опираясь на имеющиеся данные, можно выделить следующие области ЛП:
содержимое регистров общего назначения (ячейки 00–03, 10–13, 20–23… F0–F3, т. е. шестнадцать четырёхбайтовых областей — по одной для каждого регистра);
содержимое регистров с плавающей запятой (ячейки 08–0F, 28–2F, 48–4F, 68–6F для регистров 0, 2, 4, 6 соответственно);
копия текущего содержимого PSW в ячейках 88–8F (заметим, что часть информации из PSW в процессе работы машины находится также в её аппаратных регистрах, о которых будет сказано в следующей статье, т. е. наблюдается определённая избыточность; отчасти это позволяет ускорить запись старого PSW в ОП в процессе прерывания: скажем, биты масок прерываний и режимов процессора не надо извлекать из разных аппаратных регистров и собирать в байты PSW — они уже имеются в готовом виде в соответствующих ячейках ЛП);
управляющие слова устройств (УСУ) для первого и второго селекторных каналов (C8–CF и D8–DF);
области сохранения мультиплексного канала (A8–AF, B8–BC) и селекторных каналов (E8–EF, FE–FF) — в них сохраняется содержимое аппаратных регистров процессора на время так называемых МПРС, о которых кратко будет сказано ниже;
буфер команды на два байта (98–99) — в нём в процессе выборки и декодирования команды сохраняются её два первых байта; первый содержит код операции, а второй — либо непосредственный операнд (для команд формата SI), либо длины операндов (для команд формата SS), либо номера регистров (для всех остальных форматов).
Все остальные байты ЛП, судя по доступной информации, являются рабочими областями либо микропрограмм процессора, либо микропрограмм каналов. Если проводить параллели с обычным программированием, все ячейки ЛП являются глобальными переменными; аналога локальных переменных (размещаемых в стеке) внутри процессора не существует.
x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | |
0x | Общий регистр 0 | Рабочая область ЦП | Регистр с плавающей запятой 0 | |||||||||||||
1x | Общий регистр 1 | |||||||||||||||
2x | Общий регистр 2 | Регистр с плавающей запятой 2 | ||||||||||||||
3x | Общий регистр 3 | |||||||||||||||
4x | Общий регистр 4 | Регистр с плавающей запятой 4 | ||||||||||||||
5x | Общий регистр 5 | |||||||||||||||
6x | Общий регистр 6 | Регистр с плавающей запятой 6 | ||||||||||||||
7x | Общий регистр 7 | |||||||||||||||
8x | Общий регистр 8 | Текущее PSW | ||||||||||||||
9x | Общий регистр 9 | Буфер команды | ||||||||||||||
Ax | Общий регистр 10 | Область сохранения КМ | ||||||||||||||
Bx | Общий регистр 11 | Область сохранения КМ | ||||||||||||||
Cx | Общий регистр 12 | УСУ КС1 | ||||||||||||||
Dx | Общий регистр 13 | УСУ КС2 | ||||||||||||||
Ex | Общий регистр 14 | Область сохранения КС | ||||||||||||||
Fx | Общий регистр 15 | Область пульта | Рабочая область КС |
Мультиплексная память хранит управляющие слова устройств для мультиплексного канала, от которого и происходит её название (УСУ для селекторных каналов, как мы видели, хранятся в ЛП, а частично и в аппаратных регистрах самих селекторных каналов). Подробнее УСУ будут описаны в статьях, касающихся организации ввода-вывода; здесь кратко заметим, что объём МП прямо определяет количество так называемых подканалов, имеющихся у мультиплексного канала, что, в свою очередь, определяет количество внешних устройств, с которыми он может работать одновременно (у селекторного канала всегда имеется только один подканал). Впрочем, в столь слабой машине ограничителем на практике является не количество подканалов, а пропускная способность самого канала, которая очень невелика.
Заметим, что функционально эти три вида памяти имеются во всех моделях Системы 360 и её потомков, но технически они реализованы по-разному. Скажем, в ЕС-1035 (советский «полуклон» одной из первых IBMовских машин Системы 370, о которой я надеюсь написать отдельную серию статей) основная и оперативная память — это действительно одно и то же. Локальная память у процессора этой ЭВМ, конечно же, имеется и даже называется так же, но является частью собственно процессора и выполнена не на медленных микросхемах динамической памяти, как её ОП, а на сверхбыстродействующих, по тем временам (да и сейчас весьма быстрых), микросхемах статической памяти. В роли мультиплексной памяти в этой машине выступает часть так называемой управляющей памяти, тоже выполненной на микросхемах статического ОЗУ, но более медленных (и более ёмких), чем ЛП; основной объём управляющей памяти занят не управляющими словами устройств, а микропрограммами процессора и каналов. В некоторых других моделях, особенно в старших, каналы являются физически отдельным от процессора устройством, и тогда МП обычно является частью аппаратуры каналов. В общем, вариантов физической реализации довольно много, но сама идея использования нескольких видов памяти для хранения разных видов информации остаётся общей, поскольку вытекает, в первую очередь, из особенностей архитектуры.
Основная память в Системе 360 логически имеет байтовую организацию, т. е. машинное слово (32 бита) делится на отдельные байты, которые могут считываться и записываться как по отдельности, так и в составе более крупных величин — полуслов, слов и двойных слов (позже, в Системе 370, появились учетверённые слова). Адресация байтов ОП начинается с нуля и всегда является непрерывной — этим Система 360 выгодно отличается от, скажем, персональных компьютеров, где физическая память доступна через несколько несмежных областей адресного пространства, установить размеры которых не так-то просто. Хотя архитектура является 32-разрядной, адрес ОП имеет размер 24 бита, что позволяет адресовать до 16 Мбайт памяти — это огромная величина для середины 1960-х годов, машины с таким объёмом ОП стали сколько-нибудь массово появляться «у них» лишь во второй половине 1970-х, ну, а у нас — ещё десятилетием позже (откуда возникла шутка про то, что «мегабайт — американское название килобайта»).
Разряды байтов и многобайтовых величин в Системе 360 нумеруются слева направо. В частности, старший бит машинного слова имеет номер 0, младший бит — номер 31. А вот старший бит адреса имеет номер 8: в машинном слове, будь то слово, хранящееся в ОП, или содержимое некоторого регистра общего назначения, адрес занимает три младших байта, а старший байт игнорируется (и поэтому может содержать какую-либо дополнительную информацию).
Поскольку ЕС-1020 имеет не более 256 Кбайт ОП, максимально допустимый адрес равен 03FFFF. При попытке программы обратиться за пределы доступной ОП происходит программное прерывание по особому случаю адресации, а при аналогичной попытке со стороны канала ввода-вывода выполнение программы канала завершается с установкой индикатора «ошибка в программе».
При обращении к полуслову или более крупному блоку информации фиксированного размера адрес этого блока должен быть кратен его размеру, в противном случае происходит программное прерывание по особому случаю спецификации. Например, при считывании слова памяти в общий регистр программа должна использовать адрес, кратный 4. Эти требования были ослаблены в Системе 370, где большинство команд получили возможность обращаться к памяти по невыровненным адресам, но ЕС-1020 реализует архитектуру Системы 360, поэтому такие доступы запрещены. (Замечу, что подобные ограничения имеются и сейчас; скажем, процессорные ядра Cortex-M0 и Cortex-M1, реализующие архитектуру ARMv6-M, не могут обращаться к памяти по невыровненным адресам, а вот более мощные ядра, реализующие архитектуру ARMv7-M, — могут, хотя такие доступы там могут быть запрещены программно).
Допустимость доступа к той или иной памяти контролируется механизмом защиты с помощью ключей. Принцип его работы прост. У программы имеется так называемый ключ доступа, он имеет длину 4 бита и хранится вместе с другой управляющей информацией в слове состояния программы PSW (с точки зрения программиста PSW — это специальный регистр процессора; в ЕС-1020 его содержимое, как уже говорилось, хранится в ячейках 88–8F локальной памяти, а частично — и в аппаратных регистрах и триггерах процессора, о последних подробнее будет сказано в следующей статье). Когда программа обращается к памяти, вместе с адресом, размером и видом обращения (чтение или запись) она передаёт памяти свой ключ доступа. Дальнейшее поведение машины, с точки зрения программиста, определяется следующим алгоритмом:
если адрес выходит за пределы имеющегося объёма памяти или если он не выровнен должным образом, происходит программное прерывание по особому случаю адресации или спецификации соответственно;
если ключ доступа программы равен нулю, доступ безусловно разрешается (поэтому с нулевым ключом работает, вообще говоря, только код ядра операционной системы);
если ключ отличен от нуля, из памяти ключей защиты считывается ключ защиты для адресуемого блока памяти (напомню, память делится на блоки по 2 Кбайта, а поскольку невыровненные доступы архитектурой запрещены, любой доступ всегда попадает в один блок; в Системе 370 и последующих невыровненные доступы делятся на несколько выровненных меньшего размера, поэтому с точки зрения памяти каждый доступ всё равно выполняется к одному блоку);
если программа пытается прочитать информацию, а в ключе защиты блока сброшен бит защиты от выборки F, доступ разрешается;
если программа пытается записать информацию или если бит F установлен, производится сравнение четырёх битов управления доступом ACC из состава ключа защиты со значением ключа доступа программы. Если они совпадают, доступ разрешается, если нет — запрещается. В последнем случае происходит программное прерывание по особому случаю защиты.
Таким образом, весь объём ОП делится на блоки по 2 Кбайта, каждый из которых защищается индивидуально; программа имеет полный доступ только к тем блокам, для которых ключ защиты имеет биты ACC, совпадающие с ключом доступа программы. Поскольку ключ доступа и поле ACC имеют размер 4 бита, в системе одновременно может выполняться 15 прикладных программ, надёжно защищённых друг от друга, — более чем достаточно по тем временам, учитывая, что производительность даже самых мощных моделей Системы 360 не очень-то превосходила современные 8-разрядные микроконтроллеры ATMega, используемые на «ардуинках».
Доступ со стороны каналов контролируется точно так же, только используется не ключ доступа из PSW, а ключи, назначаемые канальным программам при их запуске командами ЗАПУСК ВВОДА-ВЫВОДА (SIO). Благодаря этому операции ввода-вывода, выполняемые операционной системой от имени той или иной прикладной программы, не могут получить доступ к информации другой программы.
Кстати, о терминологии. Я придерживаюсь строгих терминов «ключ защиты» и «ключ доступа»: первый означает ключ, хранящийся в памяти ключей и управляющий защитой конкретного блока ОП, а второй означает ключ, используемый выполняемой программой процессора или канала при попытке доступа к ОП. Документация IBM в качестве первого термина использует либо storage key (ключ памяти), либо protection key (ключ защиты); для обозначения второго ключа может использоваться либо термин access key (ключ доступа), либо более конкретное указание, где он находится, — обычно PSW key, т. е. ключ, находящийся в PSW и используемый программой процессора. А вот в советской литературе с терминологией наблюдается хаос; в частности, «ключ защиты» нередко, в том числе в [1], используется в значении, которое я вкладываю в термин «ключ доступа». Правда, если при чтении держать мозги включёнными, реальных проблем это не создаёт: из контекста всегда понятно, о чём именно идёт речь.
Собственно накопитель оперативной памяти в ЕС-1020 выполнен, разумеется, на традиционных в те годы ферритовых кольцах (каждое кольцо имеет диаметр 0,8 мм и хранит один бит информации) и реализован в отдельной стойке, имеющей шифр ЕС-3220. Подробно его устройство в имеющейся литературе не описывается — надо полагать, оно абсолютно типовое и хорошо знакомо инженерам 1970-х годов, поскольку принципиально такая же память использовалась в ЭВМ второго и, обычно, первого поколений. Поэтому дальше речь пойдёт не о накопителе, а о блоках связи с оперативной памятью и защиты памяти, которые являются частью собственно процессора ЕС-2420 и размещаются в его стойке, а не стойке памяти. Необходимо, однако отметить следующие аспекты, связанные с накопителем, поскольку они напрямую влияют на устройство и работу рассматриваемых узлов.
Как известно, информация хранится в ферритовой памяти в виде намагниченности сердечников. При отключении питания информация сохраняется (существовали машины, способные возобновить работу после восстановления питания с точки его отключения, — за те миллисекунды, в течение которых напряжение ещё поддерживается за счёт энергии, запасённой в катушках индуктивности и конденсаторах, процессор успевает сохранить содержимое своих регистров в памяти, что и даёт потенциальную возможность в дальнейшем возобновить работу), но вот в процессе считывания происходит её разрушение (стирание) — и, если необходимо сохранить в прочитанной ячейке её первоначальное значение, после считывания необходимо записать его обратно. В то же время, в ферритовую память нельзя просто взять и записать новое значение: сначала нужно стереть старое, что достигается его считыванием.
Таким образом, полный цикл доступа к ферритовой памяти состоит из двух половин:
считывания или стирания информации; технически это одно и то же, но при стирании информация теряется, а при считывании — сохраняется в регистре данных;
записи или регенерации; технически это, опять-таки, одно и то же, и разница чисто логическая: записывается ли новое значение или старое.
Цикл доступа к памяти, в котором эти две операции являются логически независимыми, называется расщеплённым. Именно так организована работа с памятью, наверное, в любых машинах с архитектурой Системы 360, включая наши ЕС ЭВМ, поскольку в них память достаточно тесно интегрирована с процессором и каналами, хотя физически она из-за своих больших габаритов выполнялась отдельно. В прошлой статье мы видели, что микрокоманда может задать одну из операций чтения, стирания или записи/регенерации памяти — т. е. эксплуатирует расщеплённый цикл памяти явным образом. А вот, например, в мини-ЭВМ PDP-11 фирмы DEC (их архитектура тоже нами была заимствована и воплощена в ряде моделей СМ ЭВМ — например, СМ-3, СМ-4 и СМ-1420, а также в персональных компьютерах серии ДВК и ряде других машин) ОЗУ с процессором не интегрировано, поэтому для повышения эффективности использования памяти системная шина Unibus (известная у нас как «общая шина»), соединяющая процессор с памятью и внешними устройствами, поддерживает не только операции чтения и записи, но и операцию чтения-модификации-записи. В первых двух случаях ОЗУ выполняет свой полный цикл, т. е. считывает информацию, передаёт её на шину или принимает новые данные с шины, после чего выполняет запись; в третьем случае ОЗУ неявно реализует расщеплённый цикл: считывает и передаёт данные на шину, дожидается поступления новых данных и записывает уже их, а не старые данные.
В ЕС-1020 накопитель оперативной памяти состоит из двухбайтовых ячеек (технически — из 18-битных, так как каждый информационный байт имеет свой контрольный разряд), причём индивидуальный доступ к ним невозможен. Поскольку архитектура Системы 360 предполагает байтовую организацию памяти, процессор (или каналы), желая считать один байт, всегда считывает полуслово, включающее этот байт, после чего выполняет регенерацию — записывает считанное слово обратно. При записи одиночного байта процессор считывает полуслово, заменяет в регистре данных требуемый байт новым значением, после чего выполняет запись полуслова, восстанавливая попутно содержимое «ненужного» байта.
Память ключей защиты в ЕС-1020 носит название запоминающего устройства ключей памяти (ЗУКП). Она входит в состав оборудования процессора ЕС-2420 (размещается в его стойке, а не в стойке оперативной памяти) и всегда имеет объём 128 шестиразрядных ячеек (пять бит ключа защиты плюс контрольный разряд), т. е. рассчитана на подключение к процессору максимально возможного для него объёма ОП в 256 Кбайт. Литература ничего не говорит о том, как ЗУКП реализовано физически, но, поскольку объём этой памяти довольно велик, разумно предположить, что она тоже является ферритовым ОЗУ, только несколько более быстрым (не исключено, что благодаря своему малому, по сравнению с ОП, объёму: дешифрация адреса для доступа к 128 ячейкам намного проще и быстрее, чем для доступа к 128К ячейкам).
На концептуальном уровне, как мы видели, защита памяти с помощью ключей выполняет свои функции до начала обращения к ОП, и в случае обнаружения нарушения защиты обращение ОП не производится. Однако, если придерживаться такого порядка операций на практике, производительность окажется слишком низкой: сначала пришлось бы считать адресуемый ключ из ЗУКП, затем сравнить считанный ключ защиты с ключом доступа (параллельно регенерируя содержимое прочитанной ячейки ЗУКП) и лишь после этого можно начинать обращение к ОП. Поэтому на практике защита работает одновременно с доступом к ОП. Литература не даёт полного ответа на то, как именно происходит обращение к памяти, но на основе имеющейся информации и здравого смысла резонно предположить, что порядок операций выглядит примерно следующим образом:
микрокоманда или аппаратура одного из селекторных каналов инициирует операцию считывания или стирания ОП;
одновременно с запуском чтения из ОП (что приводит к стиранию информации в считываемой ячейке) начинается считывание соответствующего ключа защиты из ЗУКП;
сразу после считывания ключ защиты сравнивается с ключом доступа, чтобы определить допустимость выполняемого обращения к ОП; в это время считывание из ОП ещё продолжается;
если доступ к ОП запрещён, считанное из ОП значение заносится в регистр данных независимо от того, была ли инициирована операция считывания или стирания; если доступ разрешён, в операции считывания данные из ОП тоже принимаются в регистр данных, а в операции стирания — теряются (в этом случае предполагается, что регистр данных уже содержит информацию для записи);
процессор или канал при необходимости меняет полностью или частично содержимое регистра данных (как уже говорилось, если нужно выполнить запись только одного байта памяти, выполняется считывание полуслова, модификация нужного байта регистра данных и запись всего содержимого регистра в память). Если доступ к ОП запрещён из-за нарушения защиты, модификация регистра данных на этом этапе блокирована, поэтому в нём сохраняется информация, ранее считанная из ОП;
процессор или канал инициирует операцию записи/регенерации, по которой содержимое регистра данных записывается в ОП (что восстанавливает старое содержимое ячейки памяти, если доступ к ней был запрещён) и одновременно считанный ранее ключ защиты записывается в ЗУКП, чем восстанавливается её содержимое;
если доступ был запрещён, в случае обращения со стороны процессора происходит прерывание (реакция на нарушение защиты со стороны селекторных каналов будет описана в соответствующих статьях).
И последнее, о чём надо помнить, разбираясь с тонкостями работы с памятью в ЕС-1020. С точки зрения архитектуры, процессор и каналы ввода-вывода — разные устройства; в первом приближении, они «состыковываются» только для инициирования и завершения операций ввода-вывода, а всё остальное время работают полностью независимо друг от друга, в том числе при обращениях к памяти; эта независимость доходит до того, что, когда процессор вручную остановлен нажатием соответствующей кнопки на пульте управления, каналы продолжают ранее начатые операции ввода-вывода до их обычного завершения. Однако во многих слабых машинах, в том числе в ЕС-1020, каналы тесно интегрированы с процессором и используют его оборудование. Как следствие, многие операции, логически относящиеся к каналам, фактически выполняются процессором.
Конкретно в ЕС-1020 мультиплексный канал реализован полностью микропрограммно; его аппаратура включает всего несколько регистров, обеспечивающих доступ к интерфейсу ввода-вывода, и простые логические схемы, обнаруживающие определённые ситуации в интерфейсе и уведомляющие процессор о необходимости обслуживания канала. Селекторные каналы, с другой стороны, должны обеспечивать довольно высокую скорость приёма или передачи данных, чтобы с ними могли работать быстрые устройства (накопители на магнитных лентах и дисках), поэтому для них используется смешанное аппаратно-микропрограммное управление: инициирование и завершение операций ввода-вывода выполняется микропрограммно, а передача данных — аппаратно. Чтобы совместить работу каналов с работой микропрограмм процессора, используются два вида приостановок:
аппаратная приостановка АПРС запрашивается одним из селекторных каналов для выполнения обмена данными с памятью; получив запрос на АПРС, процессор заканчивает обычным образом текущую микрокоманду, после чего генерация тактовых импульсов ТИ приостанавливается и начинается генерация импульсов СИ (о системе синхронизации рассказывалось в одной из предыдущих статей). Селекторный канал выполняет требуемый доступ к памяти (на это ему нужно два или три такта в зависимости от того, выполняет ли он цикл чтения, записи или чтения-модификации-записи) и снимает запрос. После этого генерация импульсов СИ прекращается и возобновляется генерация импульсов ТИ — т. е. обычное выполнение микропрограммы;
микропрограммная приостановка МПРС запрашивается либо селекторным, либо мультиплексным каналом, когда ему нужно обслуживание на микропрограммном уровне (мультиплексный канал запрашивает МПРС для любой своей операции, селекторный канал — при завершении текущей операции ввода-вывода и в других случаях, не связанных с обменом данными). Получив такой запрос, процессор завершает текущую микрокоманду, приостанавливает генерацию импульсов ТИ и запускает генерацию импульсов ХИ. Во время такта ХИ он запоминает адрес той микрокоманды, которая должна была бы выполняться, если бы не появился запрос на МПРС, считывает из постоянной памяти первую микрокоманду микропрограммы обработки запроса МПРС и возобновляет генерацию импульсов ТИ, в результате чего начинает выполняться микропрограмма обслуживания канала. Первым делом она сохраняет текущее состояние ряда регистров процессора в ЛП, затем выполняет свои функции и в конце восстанавливает сохранённые регистры и возвращает управление прерванной микропрограмме процессора (адрес возврата был сохранён в такте ХИ в соответствующем регистре, как рассказывалось в предыдущей статье). МПРС селекторного канала может прервать выполнение микропрограммы обработки МПРС мультиплексного канала, но не наоборот.
Подробнее о действиях во время приостановок будет говориться в статьях, посвящённых вводу-выводу; здесь я привёл минимальные сведения, необходимые для понимания того, для чего они вообще нужны и что из себя представляют, поскольку их наличие напрямую влияет на реализацию работы с памятью.
Интерфейс оперативной памяти
Связь памяти с процессором и каналами осуществляется через несколько регистров и триггеров.
Пути адреса и данных при обращении к оперативной памяти, скан из [1]
На приведённом рисунке показана собственно накопитель памяти, регистр адреса РМН и регистр данных РНЗ, состоящий из двух регистров РН и РЗ.
КША, входящая сверху в регистр адреса РМН, — это «кодовая шина адреса». Почему она названа кодовой, я не знаю; скорей всего, это пережиток советской терминологии 1950–60-х годов.
Регистр РМН является одним из самых «ненормальных» регистров машины. Во-первых, поскольку внутри процессор имеет байтовую организацию, все основные регистры состоят из восьми разрядов (дополняемых контрольным битом, обозначаемым К, но участвующим только в контроле правильности работы машины, поэтому не обсуждаемых в этой и других статьях — о схемах контроля будет отдельный разговор), однако в этом регистре имеется 18 информационных разрядов. Во-вторых, разряды этого регистра нумеруются не справа налево, как принято в Системе 360, а слева направо (вторым и вроде бы последним подобным регистром является РАПП, о котором говорилось в предыдущей статье).
Регистр данных памяти РНЗ, напротив, является совершенно «нормальным»: это просто логическое объединение двух независимых однобайтовых регистров РН и РЗ с «правильной» нумерацией битов (0 — старший, 7 — младший). Он работает как единое целое при обращении к оперативной памяти, поскольку обмен с ней всегда выполняется полусловами, но для микропрограммы он выглядит как два отдельных регистра. КШЧ и КШЗ, соединяющие его с памятью, — это кодовые шины чтения и записи соответственно.
Регистр адреса памяти РМН разделён на три байта, из которых старший является вырожденным и содержит только два информационных разряда. Для адресации ОП используются все 18 бит РМН (её объём может достигать 256 Кбайт), для адресации ЛП — только младший байт, для адресации МП — биты 10:0. Адресация ячеек ЗУКП, т. е. ключей защиты, выполняется битами 18:11, поскольку они содержат номер 2-килобайтового блока ОП. Заметим, что, хотя младший (нулевой) бит адреса присутствует, в реальном обращении к памяти он не участвует, так как память имеет ширину два байта; проверка выровненности адреса доступа к памяти всегда выполняется микропрограммно. Вероятно, этот бит принимается в РМН только для обеспечения работы схем контроля (контрольный разряд вырабатывается для всего байта).
ОП образует отдельное адресное пространство, а вот ЛП и МП, похоже, находятся в общем адресном пространстве. Во всяком случае, в [1] говорится о том, что адреса МП начинаются с шестнадцатеричного значения 100 — т. е. сразу за концом ЛП (её ячейки имеют адреса 00—FF).
Источник адреса для занесения в РМН задаётся полем АДРЕС микрокоманды. Им может служить:
один из 19-битных адресных регистров РМФЕ, РГРИ или РПТУ. Технически эти регистры состоят из трёх независимых регистров каждый (РМ, РФ, РЕ и так далее; эти регистры будут описаны в следующей статье), причём старший регистр в каждой тройке является вырожденным и содержит три (не два!) информационных разряда. В РМН из этих адресных регистров заносятся 18 младших разрядов, 19-й служит для обнаружения особого случая адресации (выхода за пределы ОП), о чём будет сказано ниже;
один из 8-битных адресных регистров РР, РТ или РД (РР и РТ «по совместительству» являются средними байтами РГРИ и РПТУ соответственно). Информация из этих регистров заносится в младший байт РМН, а его старшие 10 разрядов не изменяются;
константа из состава микрокоманды, заносимая в младший байт РМН без изменения его старших разрядов.
Очевидно, что для обычной адресации ОП используется занесение адреса из РМФЕ, РГРИ или РПТУ — только так можно обратиться к любой ячейке памяти. Для адресации МП тоже используются эти регистры, хотя в этом случае необходимо правильно заполнить лишь их 11 младших разрядов. А вот для адресации ЛП, имеющей объём всего 256 байт, достаточно занесения адреса из РР, РТ, РД или из поля константы. Адресация ЛП с помощью одного из байтовых регистров используется, например, при доступе к хранящимся в ЛП байтам регистров общего назначения и регистров с плавающей запятой: в этом случае микропрограмма сначала вычисляет адрес соответствующего регистра в ЛП (исходя из номера регистра, закодированного в выполняемой команде), затем заносит его в какой-либо из этих трёх адресных регистров, а после использует его для обращения к ЛП, при необходимости модифицируя содержимое адресного регистра, чтобы переходить от одной части регистра общего назначения или с плавающей запятой к другой. Конечно, при необходимости для адресации ЛП могут использоваться и «большие» регистры, при этом необходимо правильно заполнять лишь их младшие байты (РЕ, РИ, РУ). Адресация же с помощью константы удобна для доступа к ячейкам ЛП с заранее известными адресами — например, содержащим части PSW или хранящим различную служебную информацию.
По общей временной диаграмме работы процессора видно, что занесение адреса в РМН выполняется на протяжении первой половины такта — во время действия тактовых импульсов ТИ1 и ТИ2, включая промежуток между ними (в случае обращения селекторного канала в рамках АПРС — во время тактовых импульсов СИ1 и СИ2). Адрес в РМН принимается только в цикле чтения/стирания, при записи/регенерации он остаётся прежним, поэтому поле АДРЕС соответствующей микрокоманды содержит нулевой код.
Общая временная диаграмма работы процессора, скан из [1]
Одновременно с адресом производится приём другой управляющей информации, что в [1] прямо не отражено, но подразумевается; эта информация фиксируется в специальных триггерах. Известны имена нескольких из них, например, ТОП и ТМП, первый устанавливается при обращении к ОП, второй — при обращении к