Процессор ЕС-1020. Оперативная память

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

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

Сначала разберёмся с терминологией. Документация по архитектуре Системы 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]
Пути адреса и данных при обращении к оперативной памяти, скан из [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]

Одновременно с адресом производится приём другой управляющей информации, что в [1] прямо не отражено, но подразумевается; эта информация фиксируется в специальных триггерах. Известны имена нескольких из них, например, ТОП и ТМП, первый устанавливается при обращении к ОП, второй — при обращении к МП. Аналогичные триггеры должны быть и для обращения к ЛП и памяти ключей; кроме того, фиксируется тип обращения к памяти — считывание, стирание (т. е. считывание с потерей информации из памяти) или запись/регенерация. При обращении к памяти под управлением микрокоманды сигналы установки этих триггеров вырабатываются дешифраторами полей микрокоманды ТИП и РЕЖИМ; при обращении селекторного канала их выдаёт сам канал.

Считывание информации занимает достаточно длительное время; прочитанные данные появляются на выходе оперативной памяти в самом конце такта и фиксируются в регистре данных РМН в самом конце такта, по импульсу ТИ4З или СИ4З (в главе про синхронизацию в [1] ошибочно утверждается, что приём осуществляется в начале следующего такта по импульсу С1 — это опровергается описанием оперативной памяти в одной из следующих глав этой же книги, о чём ещё будет сказано; на приведённой диаграмме тоже видно, что данные появляются в конце такта считывания, а не в начале следующего).

При записи данные должны находиться в РМН на начало такта записи, поэтому, если процессор выполняет операцию чтения-модификации-записи, он модифицирует РМН в промежутке между тактами чтения из записи.

Контроль адреса

Как уже говорилось, архитектура Системы 360 требует проверять адрес на выход за пределы ОП или ПКЗ и при обнаружении такого нарушения прерывать выполнение программы (обычной, выполняемой процессором, или канальной). Контролировать выход за пределы ОП микропрограммными средствами неэффективно (на каждый доступ к памяти требуется, по меньшей мере, одна лишняя микрокоманда), поэтому даже в такой простой машине, как ЕС-1020, это реализовано аппаратными средствами.

В ЕС-1020, помимо контроля на выход за пределы ОП и ПКЗ, требуется проверять и обращения к МП — это специфическое требование данной конкретной машины. С точки зрения программиста, результатом выхода за пределы МП будет не программное прерывание по особому случаю адресации, а установка кода условия 3 в командах ввода-вывода (этот код говорит о том, что адресуемое устройство выключено или вообще отсутствует; причина его установки в данном случае — отсутствие в МП места под УСУ для работы с данным устройством), однако для аппаратуры контроль выполняется почти идентичным образом, так что неудивительно, что за него отвечает одна и та же схема.

Обработка выхода адреса за допустимые пределы, скан из [1]
Обработка выхода адреса за допустимые пределы, скан из [1]

Центральной частью схемы контроля выхода за пределы памяти является триггер сбоя адресации ТСА (слово «сбой» в данном случае выбрано не очень удачно: оно, вообще говоря, подразумевает возникновение некоей неполадки, однако в данном случае речь идёт исключительно о попытке программы прямо или косвенно использовать отсутствующую на машине ячейку памяти). Он устанавливается при наличии высокого уровня на его нижнем управляющем входе, а сбрасывается при подаче высокого уровня на верхний вход. Какой вход триггера, изображаемого на подобной схеме (её можно назвать функциональной: она отражает логику работы, но не показывает реальное устройство электронного узла, т. е. не является принципиальной схемой), устанавливает его, а какой сбрасывает, можно определить, соотнося положение управляющих входов и информационных выходов триггера: если управляющий вход расположен напротив прямого выхода, этот вход устанавливает триггер, если напротив инверсного выхода — сбрасывает.

Сигнал установки триггера ТСА формируется логической схемой; легко видеть, что для его появления должны быть одновременно выполнены следующие четыре условия.

  • Установлен любой из уже упоминавшихся триггеров ТОП и ТМП, устанавливаемых сигналами обращения к ОП и МП соответственно. Формирование этих сигналов на схеме не показано, но является самоочевидным: они являются выходами дешифратора поля ТИП микрокоманды, кроме того, сигнал обращения к ОП выдаётся при любом обращении со стороны селекторного канала.

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

    Ещё один момент. Обращение к ЛП или памяти ключей установку ТСА, согласно схеме, вызвать не может. С ЛП всё понятно: она всегда имеет объём 256 байт, и обратиться к отсутствующей в ней ячейке в принципе невозможно — а значит, и контролировать нечего. А вот доступ к памяти ключей должен контролироваться точно так же, как доступ к ОП, и с теми же последствиями (причём, заметим, объём памяти ключей логически привязан к объёму ОП, хотя физически в ЕС-1020 всегда реализованы все 128 ключей, даже если ОП меньше, чем 256 Кбайт). В принципе, контроль в этой ситуации мог бы выполняться микропрограммно: программа осуществляет явный доступ к памяти ключей без обращения к ОП только двумя специально для этого предназначенными командами, и некоторое замедление их работы вполне допустимо (они используются очень редко — только когда ОС перераспределяет память между задачами пользователя). Однако логичней предположить, что и в этом случае контроль осуществляется аппаратно — благо, для этого требуется лишь завести выход триггера обращения к памяти ключей (он в любом случае имеется) на изображённый на схеме логический элемент ИЛИ, сделав его трёхвходовым.

    Сброс триггеров ТОП и ТМП (а заодно и ТСА) производится по сигналу, названному на этой схеме «сброс» и формируемому ей же — к нему мы ещё вернёмся.

  • Присутствует сигнал либо чтения, либо стирания. Формирование этих сигналов, опять-таки, на схеме не показано, но столь же очевидно: при обращении со стороны процессора они являются выходами дешифратора поля РЕЖИМ (а скорей — выходами триггеров, устанавливаемых дешифратором поля РЕЖИМ), а при обращении селекторного канала выдаются самим каналом.

    Заметим, что сигнал записи в память не может устанавливать ТСА: в этом нет смысла, поскольку перед операцией записи всегда будет выполняться операция чтения или стирания, которая и установит ТСА.

  • Имеет место собственно ошибка адресации, т. е. для обращения используется адрес, выходящий за пределы ОП (и памяти ключей, поскольку их объём логически идентичен) или МП. Логика формирования сигнала ОШИБКА АДР тоже не показана и тоже проста, но требует дополнительных пояснений, поэтому о ней поговорим чуть ниже.

  • Наконец, присутствует тактовый импульс ТИ3 или СИ3. Столь поздняя установка ТСА — в начале второй половины такта — объясняется тем обстоятельством, что окончанием запоминания адреса обращения в РМН является окончание предыдущего тактового импульса — ТИ2 или СИ2.

Теперь о формировании сигнала ОШИБКА АДР. Как уже упоминалось выше, каждый из трёх адресных регистров РМФЕ, РГРИ или РПТУ, служащих источниками информации для РМН, состоит, на самом деле, из трёх независимых регистров. Информация в них заносится с выхода АЛУ, которое используется, в том числе, и для вычисления адреса доступа к памяти. Старший байт каждого из адресных регистров, т. е. регистр РМ, РГ или РП, является, подобно старшему байту РМН, вырожденным, но содержит не два, а три информационных бита. Из этих трёх битов два младших (6 и 7), в которые заносятся два младших бита результата вычисления в АЛУ старшего байта адреса, являются совершенно обычными и передаются в старшие биты РМН (17 и 16 — напомню, порядок нумерации битов РМН отличается от обычного для Системы 360) — они будут старшими битами 18-разрядного адреса обращения к памяти. А вот третий, самый старший бит этих регистров (его номер 5, биты 0:4 отсутствуют) называется уплотнённым битом и формируется путём выполнения операции ИЛИ между шестью старшими битами (0:5) результата АЛУ. Таким образом, если в процессе вычисления адреса в АЛУ хотя бы один из старших шести битов полного 24-разрядного адреса оказался равен единице, в бит расширения адресного регистра РМ, РГ или РП попадёт единица.

При передаче адреса из любого из адресных регистров в РМН в последний, как уже говорилось, заносятся только 18 разрядов физического адреса ОП. Фиксируется ли уплотнённый бит в каком-либо триггере, неизвестно; технически его запоминание не требуется: он нужен лишь в первом такте обращения к памяти, когда поступающий в РМН адрес гарантированно стабилен. Очевидно что равенство уплотнённого бита единице означает выход адреса за пределы 256 Кбайт — максимально возможного объёма ОП ЕС-1020; соответственно, при занесении в РМН такого адреса необходимо формировать сигнал ОШИБКА АДР. Но это ещё не всё: в машинах со 128 Кбайтами ОП единица в разряде РМН[17], а в машинах с 64 Кбайтами — единица в любом из разрядов РМН[17:16] также означает выход за пределы ОП, а значит, тоже должна устанавливать сигнал ОШИБКА АДР.

Подобным же образом должен выполняться контроль на выход за пределы МП, меняются лишь анализируемые разряды и конкретные правила анализа. Объём МП составляет либо 768, либо 1536 байтов, что с учётом начального адреса памяти 100 даёт адрес последней ячейки 3FF или 6FF. Соответственно, в первом случае бит РМН[10] не должен содержать единицу, а во втором — биты РМН[10:9] не должны содержать комбинацию 11.

Определившись с правилами контроля адреса, нетрудно нарисовать схему, которая могла бы использоваться для формирования сигнала ОШИБКА АДР.

Возможная реализация схемы формирования сигнала СБ АДР
Возможная реализация схемы формирования сигнала СБ АДР

В доступной литературе приведены далеко не все технические подробности, поэтому эта схема, как и имена сигналов на ней, — моё творчество «по мотивам». Сигналы А9, А10, А16, А17, А18, как несложно догадаться, — соответствующие линии адреса (А18 является значением уплотнённого бита, остальные являются выходами соответствующих разрядов РМН). Сигналы МП, ОП, ПКЛ показывают, к какому виду памяти выполняется обращение. Наконец, сигналы ОП64 и ОП128 указывают объём основной памяти; если оба они неактивны (равны нулю), машина оснащена 256 Кбайтами ОП.

Возвращаемся к схеме контроля адреса памяти. Сброс ТСА, а также других триггеров, управляющих обращением к памяти, — в частности, ТОП и ТМП, — выполняется сигналом «сброс» (наверняка это не его настоящее название — подобных «сбросов» в процессоре имеется немало, но книга — не принципиальная схема и не техническое описание, поэтому вольности там вполне допустимы, а зачастую и неизбежны), формируемым в любом из следующих случаев:

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

  • при сбросе системы (обычно [1] в такой ситуации говорит об аппаратном гашении, указывая имя сигнала АГ или АГ1, но на данной схеме почему-то назвали сигнал по-другому) — здесь пояснения вряд ли нужны;

  • по тактовому импульсу ХИ2. Этот случай соответствует прекращению выполнения микропрограммы до того, как она выполнит запись/регенерацию содержимого памяти, и имеет место только при возникновении аппаратной ошибки, препятствующей дальнейшему выполнению микропрограммы. Содержимое памяти, если к нему уже началось обращение, будет испорчено (стёрто) — такое может произойти при нарушении защиты, но не при особом случае адресации, но, вообще говоря, вряд ли является проблемой с учётом того, что машина в целом вышла из строя, а после её ремонта всё равно придётся загружать систему и возобновлять работу заново.

Литература не говорит, каким именно образом происходит блокировка обращения к памяти в случае недопустимого адреса. Ориентироваться на состояние триггера ТСА в данном случае нельзя: он устанавливается во второй половине такта, а время считывания из ферритовой памяти весьма велико. Возможно, считывание из накопителей оперативной памяти и памяти ключей блокируется по сигналу ОШИБКА АДР либо дешифраторы адресов, формирующие необходимые для чтения сигналы, просто не формируют их при неверном адресе. Заметим, что адрес обращения доходит до схемы формирования сигнала ОШИБКА АДР и до дешифраторов существенно раньше, чем он формально будет запомнен в РМН (что произойдёт в момент снятия сигнала ТИ2 или СИ2): этот регистр, как и все или почти все регистры процессора, построен на триггерах-защёлках, а не на значительно чаще применяемых сегодня флип-флопах, благодаря чему адрес на выходе РМН появляется почти сразу же после того, как достигнет входа регистра во время действия тактового сигнала, управляющего приёмом в этот регистр, — а в адресном регистре, являющемся источником информации для РМН, он готов ещё до начала выполнения микрокоманды обращения к памяти.

Состояние триггера ТСА, как можно видеть по схеме, влияет на состояние триггера РБС[0] и на формирование сигнала ПОДКЛ ПО ЧТ (последний здесь инверсный, о чём говорит дефис перед его именем; в более поздних схемах для обозначения инверсии обычно использовали надчёркивание). На последнем сейчас останавливаться не будем, а вот сказать несколько слов о РБС[0] будет уместно.

Этот триггер является, как можно догадаться, старшим битом регистра РБС. Подробно об этом и других регистрах будет сказано в следующей статье, однако два его разряда (нулевой и первый) тесно связаны с доступами к памяти, поэтому являются предметом рассмотрения этой статьи. Несложно понять, что РБС[0] аппаратно устанавливается, если особый случай адресации возник во время выполнения микрокоманды, но не при работе селекторного канала: он устанавливается при установленном ТСА, т. е. после обнаружения неверного адреса, но только по тактовому импульсу ТИ4, а не СИ4. Установка РБС[0] является одной из причин формирования запроса на микропрерывание, но это будет обсуждаться в статье, посвящённой прерываниям. Забегая вперёд, заметим, что сбрасывается этот триггер только микропрограммно — это делает обработчик микропрерывания после выяснения причины его вызова, для чего анализирует биты РБС[0:1].

Чтение и запись содержимого памяти

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

Функциональная схема занесения информации из оперативной памяти в один разряд регистра показана на следующем рисунке. Поскольку все биты обоих регистров РН и РЗ идентичны, достаточно разобраться с работой одного бита.

Схема занесения информации из ОЗУ в РМН, скан из [1]
Схема занесения информации из ОЗУ в РМН, скан из [1]

Собственно триггер, являющийся разрядом регистра, находится на схеме справа. Технически это так называемый DV-триггер; пример реализации такого триггера на микросхемах, использовавшихся при создании ЕС-1020, был приведён в одной из предыдущих статей. С точки зрения использования, у такого триггера имеется три входа: вход данных, вход синхронизации и вход управления.

Входом данных в данном случае является одна из линий кодовой шины чтения КШЧ. Инвертор, через который она проходит к элементу И на входе триггера, обеспечивает подачу логической единицы на тот из элементов И, который отвечает за переключение триггера в состояние, соответствующее входу данных. Поскольку почти всегда в машине одновременно доступны и прямая, и инверсная версии одного и того же сигнала, часто инвертор в явном виде попросту не нужен: на один из входов подаётся готовый прямой сигнал, а на другой — готовый инверсный.

Входом синхронизации является выход схемы ИЛИ-НЕ, на которую подаются тактовые импульсы ТИ4З и СИ4З. Это решение выглядит странным: получается, приём в триггер разрешён, когда на входе синхронизации установлен низкий уровень, а не высокий, — т. е. приём разрешён на протяжении почти всего такта, а не лишь тогда, когда данные фактически присутствуют (при завершении считывания из памяти — а это имеет место как раз в самом конце такта). Думается, что на схеме допущена ошибка, и тактовые импульсы объединяются схемой ИЛИ, а не ИЛИ-НЕ — т. е. приём в триггер выполняется именно по одному из этих импульсов (в зависимости от того, выполняется чтение памяти по микрокоманде или по запросу селекторного канала). Кстати говоря, на практике это достигается подачей инверсных сигналов синхронизации на вход элемента 2И-НЕ (элемент И-НЕ — то же самое, что элемент НЕ-ИЛИ), а из литературы известно, что синхросигналы «путешествуют» по машине, в основном, как раз в инверсном виде. Доводом в пользу этой версии служит то обстоятельство, что глава [1] про память, откуда взята эта схема, прямо говорит о приёме данных по ТИ4З или СИ4З.

Теперь посмотрим на сигнал разрешения приёма информации в РНЗ, который называется соответствующе — РАЗР ЗН, т. е. разрешение занесения. Как видим, его источником является схема ИЛИ, объединяющая два других сигнала — ПОДКЛ ПО ЧТ и ПОДКЛ ПО СТ. Из пояснительного текста становится ясно, что первый из сигналов расшифровывается как «подключение по чтению», а второй «подключение по стиранию».

ПОДКЛ ПО ЧТ вырабатывается, когда одновременно соблюдаются три условия:

  • сброшен триггер ТСА (на схеме мы видим сигнал –ТСА, т. е. инверсный выход триггера ТСА). Тут всё понятно: ТСА сброшен, если адрес обращения к ОП или МП корректен (не выходит за пределы доступного объёма памяти) либо обращение выполняется к ЛП, когда адрес просто не может быть некорректным;

  • имеется сигнал чтения («из ЦП», т. е. заданный микрооперацией ЧТ поля РЕЖИМ выполняемой микрокоманды, либо «из канала», т. е. выдаваемый селекторным каналом в рамках АПРС). Тут тоже всё понятно и логично: поскольку выполняется операция чтения из памяти, считанные данные необходимо принять в регистр данных;

  • установлен загадочный триггер ТКЛ.

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

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

Во-вторых, ключ защиты считывается и записывается, используя специально предназначенный для этого регистр, а не регистр данных памяти РНЗ, — с ним мы вскоре познакомимся.

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

В-четвёртых, регистры РН и РЗ, когда не используются для обращения к оперативной памяти, могут применяться микропрограммами как рабочие регистры для хранения промежуточных данных. Соответственно, если микрокоманда не предполагает чтения содержимого памяти, эти регистры не должны изменяться — т. е. занесение в них информации должно быть заблокировано.

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

Всё это наводит на мысль (в общем и целом подтверждаемую имеющимся описанием), что аппаратура блока связи с ОП работает максимально унифицированным образом со всеми видами памяти. Обнаружив приказ считывания или стирания любого вида памяти, она выполняет контроль адреса для выявления выхода за пределы соответствующего вида памяти (при этом вид памяти учитывается «локально» самой схемой контроля, не влияя на общую организацию работы блока); если адрес технически корректен, при обращении к ОП, ЛП или МП инициирует считывание оперативной памяти, а при обращении к ОП или памяти ключей — чтение ключа защиты. Соответственно, в схеме управления приёмом в РНЗ требуется «локальная» блокировка его изменения, если считывание оперативной памяти не выполняется — и эту роль вполне может играть ТКЛ, указывающий, что целью операции чтения является именно получение значения ключа, а не содержимого оперативной памяти.

Можно возразить, что, если ТКЛ означает обращение только к памяти ключей, то его единичное состояние, как мы видим по схеме, как раз и разрешит приём информации в РНЗ, а не запретит его. На это имеется два контраргумента. Один из них банален: в книге, как мы уже видели и ещё увидим, есть ошибки, и вполне может быть, что сигнал подаётся в инверсном виде, просто перед именем ТКЛ забыли поставить дефис. Второй контраргумент связан с наличием в процессоре триггера ТЦП, с которым нам несколько раз придётся встречаться в дальнейшем. Это «триггер центрального процессора», и он показывает, чья микропрограмма — процессора или каналов — выполняется в данный момент (это необходимо и для работы блока защиты памяти, о котором мы будем говорить позже в этой статье, и для правильной обработки микропрерывания по особому случаю адресации или защиты, и в некоторых других случаях, что будет затрагиваться в последующих статьях). Из названия и функций этого триггера как бы ясно, что он установлен при работе микропрограмм процессора и сброшен при работе каналов — но на самом деле всё обстоит строго наоборот. Соответственно, поскольку разработчики весьма вольно подошли к именованию ТЦП, они могли столь же вольно обойтись и с другими триггерами.

Итак, сигнал ПОДКЛ ПО ЧТ устанавливается, когда происходит считывание (именно считывание, а не стирание, хотя с точки зрения самой памяти это одно и то же) информации из любого вида оперативной памяти, и разрешает приём прочитанного в РНЗ. Переходим ко второму сигналу, тоже разрешающему приём в РНЗ.

ПОДКЛ ПО СТ установлен при одновременном соблюдении следующих условий:

  • сброшен триггер ТСА, т. е. с точки зрения адресации обращение к памяти корректно;

  • установлен триггер ТСТ — это триггер стирания, устанавливаемый, когда в микрокоманде или при обращении селекторного канала запрашивается стирание ячейки памяти, а не её считывание, что предшествует записи новых значений в оба байта ячейки памяти;

  • установлен пока нам не встречавшийся триггер ТНК (или, возможно, ТНКЛ — к этому вопросу мы ещё вернёмся). Это «триггер несравнения ключей» — он относится к блоку защиты памяти, о котором мы вскоре будем говорить, и устанавливается, если доступ к ОП запрещён защитой.

Таким образом, ПОДКЛ ПО СТ вырабатывается, если выполняется стирание памяти, но при этом доступ к ячейке запрещён защитой. Он нужен для предотвращения разрушения информации в адресуемой защищённой ячейке. Стирание предполагает, что ячейка будет очищена для записи новых данных, а старые данные не нужны; приём в РНЗ при стирании не выполняется, так как там уже могут находиться данные (или один из байтов данных) для последующей записи. Однако при срабатывании защиты произойдёт приём считанных данных в РНЗ, а само обновление РНЗ со стороны микропрограммы или канала, как мы чуть позже увидим, будет заблокировано — и в результате последующая операция записи занесёт в ячейку не новое, как предполагалось операцией стирания, а старое значение. Благодаря этому содержимое ячейки оказывается защищено от разрушения, хотя сам факт запрещённого доступа обнаруживается уже довольно поздно — после начала считывания (и разрушения) информации.

Теперь посмотрим на РНЗ в плане его подключения его входов к выходу арифметико-логического устройства процессора (блока БА; его выход носит обозначение С).

Схема занесения информации в РНЗ с выхода БА, скан из [1]
Схема занесения информации в РНЗ с выхода БА, скан из [1]

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

  • активен тактовый импульс ТИ4 — именно по нему осуществляется приём в любые регистры результата операции из БА (АЛУ);

  • имеется сигнал РН:=С или РЗ:=С — эти сигналы поступают с выхода дешифратора поля С микрокоманды, задающего регистр, в который должна быть принята информация с выхода БА;

  • отсутствует сигнал ОТКЛ АК, формируемый блоком защиты. Он устанавливается, когда доступ к ячейке ОП запрещён механизмом защиты; в данном случае он блокирует изменение РНЗ со стороны микропрограммы, пока считанная из памяти защищённая ячейка не будет вновь записана в память.

Теперь посмотрим на схему приёма в РНЗ информации, поступающей от каналов.

Схема приёма данных в РНЗ из канала, скан из [1]
Схема приёма данных в РНЗ из канала, скан из [1]

На схеме мы видим тот же триггер с новыми цепями управления. Источником информации для регистра РН является регистр РНК, а для РЗ — РЗК, причём занесение может выполняться в каждый из регистров индивидуально, что управляется сигналами РН:=РНК и РЗ:=РЗК. Регистры РНК и РЗК — это регистры данных каналов; всего их по три штуки (свои регистры у мультиплексного и каждого из двух селекторных каналов). Наличие двух независимых сигналов позволяет записывать либо один из двух байтов, либо оба байта сразу — это зависит от положения и длины буфера данных и от того, сколько байтов поступило от внешнего устройства для записи в ОП. О формировании этих сигналов будет сказано в статьях, посвящённых вводу-выводу.

Изменение РНЗ блокируется сигналом ОТКЛ АК, как и в случае занесения информации с выхода БА, — т. е. в случае, если канал пытается записать принятые данные в защищённую область памяти, содержимое последней не пострадает, поскольку будет считано в РНЗ и затем записано обратно.

Обращает на себя внимание наличие двух тактовых импульсов, по которым осуществляется приём информации из каналов — СИ2З и ТИ3. Первый из них вырабатывается во время АПРС и служит для приёма данных, поступающего от одного из селекторных каналов. Второй сигнал служит для синхронизации приёма данных от мультиплексного канала во время МПРС; напомню, что все функции последнего реализуются микропрограммными средствами с минимальным количеством дополнительной аппаратуры.

Заметим, что на приведённой схеме тоже допущена ошибка. Если подать инверсные синхросигналы СИ2З и ТИ3 на элемент 2ИЛИ-НЕ, на выходе последнего всегда будет нуль: когда активен СИ2З, неактивен ТИ3, и наоборот, а соответственно, один из инверсных тактовых сигналов всегда будет равен единице, что даст постоянный нуль на выходе элемента. Правильный вариант — подача прямых тактовых сигналов на элемент 2ИЛИ или же инверсных на элемент 2И-НЕ; последний способ и является наиболее вероятным.

Но на этом «страдания» РНЗ не заканчиваются. У этого регистра есть регистр-дублёр РН1З1, назначение которого — сохранить содержимое РНЗ на время АПРС. Дело в том, что селекторный канал может прервать выполнение микропрограммы в любое время, а в РНЗ в этот момент может находиться необходимая для микропрограммы информация. Соответственно, в начале АПРС её надо сохранить, а в конце — восстановить, что и делается с помощью регистра-дублёра.

Схема обмена данными между РНЗ и его дублёром, скан из [1]
Схема обмена данными между РНЗ и его дублёром, скан из [1]

Слева вверху на схеме показан триггер из состава РНЗ, справа вверху — его дублёр. Приёмом или хранением информации в регистре-дублёре управляет вспомогательный триггер, изображённый на схеме в левой нижней части. Как видим, он устанавливается сигналом ТИ2 и остаётся установленным до тех пор, пока не появится сигнал СИ1. Пока он установлен, что имеет место при обычном выполнении микропрограммы, информация с выхода РНЗ непрерывно передаётся сквозь РН1З1 (он — защёлка, а не флип-флоп) и никак не используется. Когда начинается АПРС и формируется первый сигнал СИ1, вспомогательный триггер сбрасывается, и регистр-дублёр защёлкивает информацию, хранившуюся на этот момент в РНЗ; последующее изменение содержимого РНЗ во время АПРС никак не сказывается на значении, хранимом дублёром. В конце АПРС из блока синхронизации поступает сигнал РНЗ:=РН1З1, переписывающий информацию из регистра-дублёра в РНЗ, и вслед за этим возобновляется генерация синхроимпульсов ТИ вместо СИ. В первом же такте ТИ после АПРС триггер устанавливается, и дублёр опять начинает принимать информацию из РНЗ.

Как видим, регистр данных памяти имеет весьма сложное управление, поскольку информация в него может поступать в различные моменты времени и из разных источников — из самой памяти, с выхода БА, из селекторного или мультиплексного каналов или из регистра-дублёра.

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

Возможная реализация одного разряда РНЗ
Возможная реализация одного разряда РНЗ

Блок защиты

В состав блока защиты входят запоминающее устройство ключей памяти (ЗУКП), регистр блока защиты РБЗ, узел сравнения ключей УСБЗ и узел выработки контрольного бита УВКР. Структурная схема блока и потоки данных в нём приведена на рисунке.

Потоки данных в блоке защиты, скан из [1]
Потоки данных в блоке защиты, скан из [1]

ЗУКП хранит 128 ключей защиты памяти — ровно столько необходимо для максимально возможного ОП в 128 Кбайт. Каждая ячейка ЗУКП состоит из шести битов: контрольного разряда К, четырёх битов управления доступом ACC и бита защиты от выборки F (с точки зрения программиста ключ является пятибитным, как говорилось в начале этой статьи; контрольные разряды программисту не видны). Как технически выполнено ЗУКП, литература молчит, но я предполагаю, что это тоже ферритовая память: выполнять такой объём оперативной, по своей сути, памяти на имевшихся в то время микросхемах абсолютно нецелесообразно. Соответственно, доступ к ней всегда состоит из двух операций — считывания/стирания и записи/регенерации.

РБЗ служит для хранения ключа защиты, считываемого из ЗУКП или записываемого в ЗУКП, и одновременно для хранения текущего ключа доступа, используемого микропрограммой. Во время выполнения микропрограмм процессора в нём содержится ключ доступа из PSW, при выполнении микропрограмм каналов в него заносится ключ доступа канальной программы, обслуживаемой в данный момент.

Поскольку ключ памяти имеет длину пять бит (не считая контрольного), а ключ доступа — четыре бита, в РБЗ необходимо иметь девять информационных разрядов; в то же время внутренние потоки данных процессора имеют ширину один байт. Разработчики совместили несовместимое, сделав РБЗ самым извращённым регистром машины: как видно по структурной схеме, у него два четвёртых разряда: биты 0:4 содержат ключ защиты памяти из ЗУКП (контрольный разряд ячейки ЗУКП попадает в бит К), а биты 4':7 — текущий ключ доступа.

Считывание из ЗУКП выполняется либо неявно во время считывания или стирания ОП (для обеспечения защиты содержимого ячейки ОП), либо явно во время считывания или стирания памяти ключей. В любом случае ячейка ЗУКП адресуется битами РМН[17:11], адрес в который попадает из одного из адресных регистров РМФЕ, РГРИ или РПТУ, как описывалось выше. Считанное из ЗУПК значение попадает в биты РБЗ[К,0:4], откуда поступает в узел сравнения, а также может быть передано на вход А БА, о чём поговорим позже. Подозреваю, что операция стирания ключа вообще ничем не отличается от его считывания: никаких признаков блокировки приёма в РБЗ информации из ЗУКП в литературе нет.

В качестве лирического отступления: в случае с оперативной памятью тоже можно обойтись лишь операцией считывания: выполнить микрокоманду считывания ОП/ЛП/МП, записать двумя микрокомандами сначала в РН, а потом в РЗ подлежащие записи байты и выполнить микрокоманду записи. Однако такая последовательность, как видим, требует выполнения двух промежуточных микрокоманд между считыванием и записью, т. е. двух тактов процессора, а ведь нередко информацию в РНЗ можно занести заранее (в частности, один из байтов этого регистра может быть записан с выхода БА в процессе такта стирания — когда из памяти технически выполняется считывание, но результат теряется, не портя содержимое РНЗ). Таким образом, микрооперация стирания нужна не по техническим причинам, а для ускорения работы процессора. С другой стороны, запись нового значения в ЗУКП требуется крайне редко — при выполнении микропрограммы реализации команды УСТАНОВКА КЛЮЧА ПАМЯТИ (SSK), и потеря в ней лишнего такта для записи нового значения в РБЗ уже после считывания старого ключа на реальной производительности машины никак не сказывается (команда SSK выполняется, может быть, один раз между миллионом других команд, поскольку нужна только при перераспределении памяти между задачами пользователя, да и то не всегда). Поэтому именно в данном случае вполне можно было сэкономить немного «железа», не реализовав схему блокировки занесения в РБЗ.

Явная запись в ЗУКП из тех же разрядов РБЗ выполняется в микрокоманде записи в память ключей, но, по всей вероятности, имеется и неявная запись — одновременно с записью в ОП; неявная запись восстанавливает ранее считанный ключ памяти, т. е. является его регенерацией.

Теперь о извращениях с доступом к РБЗ со стороны БА. Считывание содержимого РБЗ производится на вход А БА по соответствующей микрооперации поля А. С разрядами 0:3 и 5:7 всё понятно: они передаются на соответствующие разряды входа А. А вот в качестве разряда 4 выбирается либо бит 4 (т. е. младший бит ключа, считанный из ЗУКП, — он содержит бит F ключа), либо бит 4', в котором хранится старший разряд текущего ключа доступа, что зависит от состояния уже упоминавшегося триггера центрального процессора ТЦП: когда он сброшен (выполняется микропрограмма процессора), происходит передача бита 4, а когда установлен (выполняется микропрограмма канала) — бит 4'.

Как именно выполняется приём в разряды 4 и 4' с выхода БА по соответствующей микрооперации поля С, с полной уверенностью сказать нельзя, но и приведённая структурная схема, и «медитация» над этой проблемой говорят о том, что информация записывается сразу в оба этих бита, как и во все остальные разряды регистра (по тактовому импульсу ТИ4, как это происходит при приёме информации с выхода БА в любые другие регистры). Отсутствие возможности выбора записываемого бита с помощью ТЦП несколько упрощает схему и почти не несёт негативных последствий. Единственным «пострадавшим» будет микропрограмма реализации команды SSK: она, завершив запись нового значения ключа памяти в ЗУКП (для чего ей надо сначала записать этот ключ в РБЗ), должна затем восстановить в бите 4' его старое значение — старший разряд ключа доступа процессора. Для этого требуется выполнить несколько дополнительных микрокоманд, но, как уже говорилось, скорость выполнения этой команды практически никакого значения не имеет. Все остальные операции записи в РБЗ со стороны БА связаны с заменой ключа доступа: либо при смене PSW (при прерывании или выполнении команды ЗАГРУЗКА PSW), либо при переходе к микропрограмме обслуживания каналов и последующем возврате из неё; соответственно, во всех этих случаях необходима запись именно в разряды 4':7, а одновременная с этим запись в разряды 0:4 вообще ни на что не влияет.

На узле выработки контрольного бита останавливаться не будем — он предназначен для контроля правильности работы машины, чему будет посвящена отдельная статья. Заметим лишь, что он необходим по той причине, что содержимое РБЗ является «сборной солянкой», и заранее вычисленного контрольного бита у него нет: разряд К относится лишь к ключу, считанному из ЗУКП, и не может учитывать состояние битов 4':7; вместе с тем, при передаче данных из РБЗ в БА необходимо снабдить выбранные для передачи восемь информационных разрядов правильным контрольным битом — чем и занимается эта схема.

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

Само по себе сравнение ключей элементарно: биты РБЗ[0:3], содержащие поле ACC считанного из ЗУКП ключа защиты, сравниваются с битами ключа доступа — либо разрядами РБЗ[4':7], если обращение к памяти выполняется микропрограммой, либо с ключом, поступающим прямо из селекторного канала во время АПРС (у селекторных каналов есть собственные регистры ключей доступа). Если хотя бы один разряд ключа доступа не совпадает с соответствующим разрядом ключа защиты, вырабатывается сигнал ОШИБКА ЗАЩ, поступающий на приведённую ниже схему.

Обработка особого случая защиты, скан из [1]
Обработка особого случая защиты, скан из [1]

Триггер несравнения ключей ТНКЛ (возможно, ТНК — в ранее приведённой схеме мы видели сигнал ТНК, имеющий то же значение, что наводит на мысль об опечатке в одной из схем) устанавливается при одновременном соблюдении следующих условий:

  • активен сигнал ОШИБКА ЗАЩ, т. е. биты ACC ключа защиты памяти из ЗУКП не равны ключу доступа;

  • активен сигнал КЛ ЗАЩ ≠ 0. Здесь речь идёт, на самом деле, о ключе доступа (о вольностях в советской терминологии я уже говорил): если он равен нулю, защита, по сути, отключается и доступ должен быть разрешён независимо от значения ключа защиты из ЗУКП;

  • отсутствует сигнал БЛК АЗ — он блокирует возникновение микропрерываний по особым случаям адресации и защиты, и к нему мы ещё вернёмся;

  • активен синхроимпульс ТИ3 или СИ3.

Сбрасывается ТНКЛ тем же сигналом, что сбрасывает триггеры вида памяти и триггер ТСА — т. е. при сбросе процессора, при входе в микропрерывание обработки аппаратной ошибки (по импульсу ХИ2) или по ТИ3/СИ3 при выполнении такта записи в память, чем заканчивается цикл обращения к памяти.

В этой схеме мы снова видим формирование уже знакомого нам сигнала ПОДКЛ ПО СТ, заставляющего принять в РНЗ считанные из ОП данные в микрокоманде стирания — чтобы не допустить их порчи, поскольку доступ к ним запрещён.

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

А вот дальше начинаются более интересные вещи. Мы видим схему ИЛИ, формирующую сигнал СБЗ СК (сбой защиты селекторного канала — но, на самом деле, не только его). Этот сигнал вырабатывается, если установлен ТНКЛ (защита активна и ключи не совпали) и при этом соблюдается хотя бы одно из следующих условий:

  • активен один из сигналов РН:=РКН или РЗ:=РКЗ. Напомню, что эти сигналы заносят в РН или РЗ значение, принятое каналом от устройства и подлежащее записи в ОП, т. е. свидетельствуют о желании канала выполнить запись данных. Поскольку ключи не совпали, а защита активна (ключ доступа отличен от нуля), запись безусловно запрещена, а значит, её попытка должна вырабатывать сигнал ошибки СБЗ СК (собственно запись в РН или РЗ выполнена не будет, так как она блокирована сигналом ОТКЛ АК, т. е. самим триггером ТНКЛ);

  • поступает сигнал, названный здесь «защита по чтению». Им является выход разряда РБЗ[4], куда попадает бит F ключа защиты памяти, считанного из ЗУКП. Когда он установлен, защита распространяется не только на запись, но и на считывание, т. е. доступ к памяти при несовпадении ключей (и ненулевом ключе доступа) безусловно запрещён — а значит, нужен сигнал ошибки;

  • выполняется такт стирания, что является признаком будущей операции записи во всё полуслово памяти как со стороны каналов, так и со стороны процессора.

Сигнал СБЗ СК, очевидно, передаётся в селекторный канал, который обрабатывает нарушение защиты — прекращает выполнение канальной программы и впоследствии устанавливает бит «ошибка в программе» в слове состояния, записываемом в память при прерывании ввода-вывода.

Но наличие этого сигнала означает нарушение защиты не только со стороны селекторного канала, но и со стороны микропрограммы, хотя для последнего случая его нужно дополнить анализом на наличие сигналов РН:=С и РЗ:=С, т. е. на попытку выполнить запись в РН или РЗ со стороны микропрограммы, что и делается в нижней части схемы. Если попытка недопустимого доступа действительно предпринята микропрограммой, в конце такта будет присутствовать импульс ТИ4, по которому произойдёт установка уже упоминавшегося триггера РБС[1] — индикатора нарушения защиты памяти в микропрограмме.

Единичное состояние РБС[0] (особый случай адресации) или РБС[1] (особый случай защиты) обычно приводит к микропрерыванию и вызову микропрограммы обработки этих особых случаев. В этой статье мы не будем углубляться в данный вопрос — он связан с обсуждением прерываний вообще, так что отложим его на будущее.

Осталось разобраться с сигналом БЛК АЗ, блокирующем установку ТНКЛ даже при явном нарушении защиты — а значит, не дающим аппаратуре «спасти» содержимое памяти. Схема его формирования показана на рисунке.

Схема формирования сигнала БЛК АЗ, скан из [1]
Схема формирования сигнала БЛК АЗ, скан из [1]

Сама схема очень проста. Как видим, сигнал БЛК АЗ будет активен, то есть равен нулю (он инверсный, о чём говорит дефис перед его именем) только при соблюдении следующих условий:

  • нет аппаратной приостановки (АПРС), т. е. доступ к памяти выполняется микропрограммой, а не селекторным каналом — от доступов последнего память защищается всегда;

  • сброшен триггер ТЦП, т. е. выполняется микропрограмма процессора, а не канала;

  • установлен триггер ТБЛПРВ.

Последний устанавливается и сбрасывается соответствующими микрооперациями поля УСТАНОВ; дешифратор этого поля вырабатывает сигналы ТБЛПРВ:=0 и ТБЛПРВ:=1, которые мы видим на схеме.

Таким образом, микропрограмма процессора может заблокировать работу механизма защиты путём установки ТБЛПРВ. Это применяется в микропрограмме сброса процессора: на момент сброса содержимое всех видов памяти и регистров процессора может быть совершенно произвольным, включая неверные значения контрольных битов. По этой причине данная микропрограмма блокирует работу схем контроля и защиты, устанавливает исходные значения аппаратных регистров и «освежает» все ячейки памяти: считывает их значения, игнорируя нарушение защиты или неверные контрольные разряды, «прогоняет» их через БА, что восстанавливает правильные значения контрольных разрядов, и снова записывает в память. Этим способом, с одной стороны, гарантируется предсказуемое значение аппаратных регистров процессора, с другой — наличие правильных контрольных битов во всех регистрах и в памяти (при условии, конечно, что аппаратура функционирует правильно), а с третьей — сохраняется старое содержимое памяти и программно доступных регистров процессора (регистров общего назначения, с плавающей запятой и PSW): сброс в Системе 360 их не изменяет, они меняются лишь в ходе выполнения программы.

Заключение

Как видим, доступ к памяти реализован в ЕС-1020 довольно нетривиальным образом, несмотря на всю простоту этой машины в целом. Это вызвано двумя причинами, и обе напрямую связаны с особенностями архитектуры Системы 360:

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

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

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

Литература

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

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

Источник: https://habr.com/ru/articles/737690/


Интересные статьи

Интересные статьи

Об управление памятью в iOS ходят много слухов, поэтому я собрал все самые интересные в интернете и попробовал их структурировать в один большой
Все айтишники знают, что процессор это сердце компьютера, как персонального, так и серверного. Да и не только компьютера. Процессоры есть и в смартфонах, некоторой бытовой технике и даже в детских игр...
Вчера вечером компания AMD представила публике свои флагманы новой линейки процессоров Ryzen 5000 серии для десктопов. На презентации были показаны в основном флагманские изделия: оди...
Вчера компания Intel представила публике свой новый восьмиядерный процессор (16 потоков) i9-9900KS с тактовой частотой в 5,0 GHz на каждое ядро в режиме Turbo. Режим Turbo в процессорах Intel — э...
Привет! Хочу рассказать простым языком о механике возникновения steal внутри виртуальных машин и о некоторых неочевидных артефактах, которые нам удалось выяснить при его исследовании, в котор...