Spacelab — многоразовая лаборатория, которую перевозили в грузовом отсеке Space Shuttle: она давала астронавтам место для проведения экспериментов на орбите. Поскольку проект был европейским, в нём использовался французский миникомпьютер Mitra 125 MS, а не основные бортовые компьютеры Shuttle производства IBM — системы AP-101. В качестве накопителя компьютер Spacelab располагал 128 килобайтами оперативной памяти. Вместо кремниевой памяти применялась магнитная память на ферритовых сердечниках, где каждый бит хранился в крошечном ферритовом кольце. Ниже — подробный разбор системы core-памяти этого компьютера.

Стек core-памяти компьютера Spacelab. Верхняя плата снята, чтобы показать плоскости сердечников.

Стек core-памяти компьютера Spacelab. Верхняя плата снята, чтобы показать плоскости сердечников.

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

Spacelab представлял собой герметичный цилиндр в грузовом отсеке шаттла, соединённый с ним туннелем. Он служил лабораторией для проведения экспериментов. Иллюстрация NASA, C-1976-4380.

Spacelab представлял собой герметичный цилиндр в грузовом отсеке шаттла, соединённый с ним туннелем. Он служил лабораторией для проведения экспериментов. Иллюстрация NASA, C-1976-4380.

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

Стек core-памяти перед компьютером Mitra. Платы удалены с дальней стороны компьютера.

Стек core-памяти перед компьютером Mitra. Платы удалены с дальней стороны компьютера.

Как работает core-память

Одной из самых сложных задач для ранних компьютеров было хранение данных. Машины конца 1940-х — начала 1950-х годов хранили информацию с помощью звуковых волн в ртути, точек на экране ЭЛТ или вращающихся магнитных барабанов, но у всех этих подходов были ограничения. Компьютерам требовалось плотное, недорогое хранилище, которое было бы быстрым, надёжным и допускало произвольный доступ.

Во время Второй мировой войны Германия разработала специальные магнитные сплавы, способные «переключаться» из одного магнитного состояния в другое. После войны американские исследователи поняли, что эти материалы можно использовать для хранения двоичных данных: «Было совершенно очевидно, что из этого материала можно сделать память», — говорил Ян Райхман. Различные аспекты core-памяти были запатентованы разными изобретателями (включая независимого изобретателя Фредерика Вихе, Ан Ванга из Гарварда, Яна Райхмана из RCA и Джея Форрестера из MIT), что привело к дорогостоящим патентным спорам. (В итоге IBM заплатила 400 000 долларов Вангу — на эти деньги он основал компанию Wang Laboratories — и 13 000 000 долларов MIT.) Джея Форрестера можно считать самым важным изобретателем: он разработал конструкцию практичной core-памяти, исследовал магнитные материалы и построил первую core-память в 1953 году для новаторского компьютера Whirlwind.

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

Ключевая проблема core-памяти заключалась в том, как соединить сердечники проводами без абсурдного их количества: если бы у каждого сердечника был отдельный провод, всего 16 КБ памяти потребовали бы свыше 100 000 проводов. Решением стала «адресация совпадающими токами» (coincident current addressing). Сердечники расположены в виде сетки с горизонтальными и вертикальными проводами, как показано ниже. Пропуская ток через один горизонтальный и один вертикальный провод, выбирался единственный сердечник на их пересечении. Но разве это не намагнитило бы все сердечники вдоль этих проводов? Ключевую роль здесь играло то, что сердечники изготавливались из специальных магнитных материалов со свойством гистерезиса: небольшой ток оставляет сердечник неизменным, а более сильный ток переключает его магнитное состояние. Токи в горизонтальных и вертикальных проводах подбирались так, чтобы каждый провод нёс лишь половину тока, необходимого для переключения сердечника; там, где провода пересекались, суммарное магнитное поле оказывалось достаточным для переключения.

Подача тока на X-провод и Y-провод выбирает один сердечник, выделенный жёлтым. Диаграмма адаптирована из Digital Computer Components and Circuits, R. K. Richards, стр. 355

Подача тока на X-провод и Y-провод выбирает один сердечник, выделенный жёлтым. Диаграмма адаптирована из Digital Computer Components and Circuits, R. K. Richards, стр. 355

Следующий шаг — чтение сердечника. Через все сердечники двумерной плоскости пропускался считывающий провод (sense wire). Для чтения сердечника провода X и Y приводились в действие так, чтобы переключить нужный сердечник в состояние 0. Если сердечник уже находился в состоянии 0, ничего не происходило. Но если исходно он был в состоянии 1, магнитное поле менялось вместе с переключением состояния сердечника. Это индуцировало небольшой ток в считывающей линии, сигнализируя о том, что сердечник хранил 1. Важно, что чтение значения бита разрушает это значение. Поэтому после чтения сердечник нужно перезаписать, чтобы восстановить исходные данные.

Для доступа к целому слову памяти за раз плоскости сердечников объединялись в трёхмерный стек (ниже). Поскольку каждая плоскость хранила один бит слова, 16-битное слово требовало стек из 16 плоскостей. Все плоскости использовали общие сигналы для управления линиями X и Y, поэтому один «столбец» слова через весь стек обрабатывался параллельно. У каждой плоскости была отдельная считывающая линия для вывода бита.

Стек core-памяти бортового компьютера ракеты Saturn V (LVDC) состоит из 14 плоскостей сердечников. Этот стек находится в US Space & Rocket Center. Фото NCAR EOL, ретушировано для устранения искажений от пластикового корпуса.

Стек core-памяти бортового компьютера ракеты Saturn V (LVDC) состоит из 14 плоскостей сердечников. Этот стек находится в US Space & Rocket Center. Фото NCAR EOL, ретушировано для устранения искажений от пластикового корпуса.

Но как записать разные значения в разные биты? Решением стало добавление «запрещающей» (inhibit) линии через все сердечники плоскости, направленной противоположно линиям X. Пропуская ток через inhibit-линию, можно было погасить ток линии X, не позволяя сердечнику в этой плоскости измениться. Итого цикл чтения-записи выглядел так: сначала возбуждалась пара линий X и Y для выбора слова и записи 0 в столбец сердечников этого слова. Считывающие линии выдавали значения битов. Затем линии X и Y возбуждались в обратном направлении для записи 1 в сердечники. Одновременно inhibit-линии возбуждались для каждой плоскости с битом 0. Таким образом сердечники либо переключались обратно в 1, либо оставались в 0, как требовалось. Во многих core-памятях, как показанная ниже, для sense и inhibit использовался общий провод, поэтому через каждый сердечник проходило три провода.

Крупный план плоскости сердечников IBM 360 Model 50. Сердечники в этом компьютере назывались 19-32, потому что их внутренний диаметр составлял 19 мил, а внешний — 32 мила (0,8 мм).

Крупный план плоскости сердечников IBM 360 Model 50. Сердечники в этом компьютере назывались 19-32, потому что их внутренний диаметр составлял 19 мил, а внешний — 32 мила (0,8 мм).

Последним важным элементом, сделавшим core-память практичной, стала диодная матрица. Линии X и Y требуют драйверных схем, способных выдавать быстрые двунаправленные импульсы высокого тока (например, 600 мА). Плоскость core-памяти может содержать сотни таких линий. Установка отдельного драйвера на каждый провод обошлась бы очень дорого, особенно в эпоху электронных ламп. Решение состояло в том, чтобы разместить отдельные драйверы на каждом конце провода, причём каждый драйвер обслуживал несколько проводов. Для простого примера: пусть есть 9 вертикальных линий. Разместим три драйвера (A, B, C) сверху, каждый подключён к трём проводам, и три драйвера (1, 2, 3) снизу, каждый — тоже к трём проводам. Активируя драйвер сверху и драйвер снизу (например, B и 1), возбуждается соответствующий провод. Теперь N драйверов с каждой стороны управляют N² проводами, поддерживая в общей сложности N⁴ сердечников.

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

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

К сожалению, всё не так просто. Ток может идти по «обходным путям» через сердечники, как розовый путь на схеме выше. Решение — добавить диоды, чтобы ток не мог пойти по неверному пути. Поскольку провод нужно возбуждать токами в обоих направлениях (чтобы переключать сердечники в обе стороны), на каждый провод требуется два диода, как показано ниже, — по одному на каждое направление. Каждый вход матрицы (A, B и т. д.) заменяется двумя входами — по одному для каждого направления. (Горизонтальные провода также требуют диодов, не показанных на схеме.)

Добавление диодов гарантирует, что ток пойдёт только по нужному пути.

Добавление диодов гарантирует, что ток пойдёт только по нужному пути.

Поскольку на каждый провод требуется два диода, в core-памяти использовалось множество диодов. К счастью, диоды были маленькими и дешёвыми, поэтому их большое количество не создавало проблем. На фото ниже — диодный стек компьютера, использовавшегося в ракете Saturn V — Launch Vehicle Digital Computer.

Крупный план диодной матрицы в LVDC ракеты Saturn V. Диоды смонтированы вертикально методом cordwood между двумя печатными платами.

Крупный план диодной матрицы в LVDC ракеты Saturn V. Диоды смонтированы вертикально методом cordwood между двумя печатными платами.

Изначально core-память изготавливали вручную — трудоёмко и долго. Для компьютера Whirlwind на распайку одной плоскости 64×64 сердечника уходило целых 40 часов. Компании вроде IBM вскоре разработали автоматизированные методы производства core-памяти, и цена падала вдвое каждые два года — по аналогии с законом Мура. Core-память стала быстрой, недорогой и надёжной и оставалась самой популярной формой основной памяти до тех пор, пока в 1970-х её не вытеснила полупроводниковая память.

Core-память компьютера Spacelab

Память компьютера Spacelab была изготовлена в 1980 году — поздняя дата для core-памяти, поэтому конструкция отличается прогрессивностью и высокой плотностью. На фото ниже — одна из четырёх плат с плоскостями сердечников. Каждая плата хранит 16 K 18-битных слов (32 КБ), так что в сумме компьютер располагает 128 КБ ОЗУ. Сам компьютер 16-битный, но каждое слово дополнено битом чётности и битом «защиты хранения», что в сумме даёт 18 бит. (Бит защиты хранения обеспечивал защиту от записи на уровне отдельного слова, предотвращая случайную перезапись программ. Поскольку core-память энергонезависима, программу можно было загрузить в память один раз, и она становилась доступна сразу же при каждом включении компьютера.)

Одна из плат core-памяти компьютера Spacelab.

Одна из плат core-памяти компьютера Spacelab.

Плата core-памяти организована как 1024 вертикальных (Y) провода и 288 горизонтальных (X) проводов, поддерживающих 294 912 литий-ферритовых сердечников. Эти очень тонкие провода припаяны к крошечным площадкам на печатной плате. Плата поддерживает 18 бит, что видно по 18 чередующимся зелёным и медным полосам, поскольку соседние считывающие линии имеют разные цвета. На плате 36 считывающих линий: левая и правая половины платы имеют независимые считывающие линии для снижения помех, поэтому на 18 бит приходится 36 линий. Считывающие провода проходят через четыре отверстия в плате (зелёные стрелки) и припаяны на обратной стороне.

На фото ниже — крупный план сердечников. Каждый сердечник имеет диаметр примерно 32 мила (0,8 мм) — так же, как у сердечников IBM System/360, показанных ранее. Однако здесь сердечники расположены гораздо плотнее, с небольшим зазором между ними. Провода выбора X и Y — медного цвета, считывающие линии — зелёные (все провода покрыты эмалью для предотвращения короткого замыкания). Считывающие провода образуют петлю слева, формируя единую цепь через каждую битовую секцию. Половина Y-линий образует петли внизу, другая половина — вверху. Таким образом, каждая Y-линия проходит через плоскость дважды в форме буквы U, что окажется важным далее.

Крупный план сердечников. Похоже, что одни ряды наклонены влево, а другие вправо, чтобы считывающие линии сохраняли ту же полярность при смене направления. Фото предоставлено CuriousMarc.

Крупный план сердечников. Похоже, что одни ряды наклонены влево, а другие вправо, чтобы считывающие линии сохраняли ту же полярность при смене направления. Фото предоставлено CuriousMarc.

На обратной стороне каждой платы размещены усилители считывания и диодная матрица для плоскости сердечников. Диодные чипы — квадратные чёрные корпуса, каждый содержит 16 диодов на 8 линий сердечников. В областях, обведённых красным, один конец каждой вертикальной U-петли соединён с диодным чипом; ряды диагональных отверстий — это переходные отверстия (via), проводящие каждый сигнал через плату. Другой конец каждой вертикальной U-петли соединён с одним из синих разъёмов платы сбоку; эти переходные отверстия находятся в областях, обведённых синим. Горизонтальные линии используют диодные чипы и переходные отверстия в зелёных областях. Один конец каждой линии подключён к диодному чипу, а другой — к разъёму платы через дорожки на другой стороне. Обратите внимание, что некоторые вертикальные линии подключаются к диодным чипам сверху платы, а другие — снизу. Аналогично, часть горизонтальных линий подключается слева, а часть — справа.

Обратная сторона платы с плоскостью сердечников содержит диодные матрицы и усилители считывания.

Обратная сторона платы с плоскостью сердечников содержит диодные матрицы и усилители считывания.

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

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

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

Детектирование сигналов на считывающих линиях — сложная задача, поскольку импульсы очень малы, всего несколько милливольт. Из-за того, что считывающие линии проходят рядом с линиями возбуждения X, они легко подхватывают помехи от высокотоковых импульсов на X-линиях. Чтобы минимизировать эти помехи, считывающие линии пересекаются между двумя секциями плоскости, образуя «бабочку» (bow tie), как показано ниже. В результате X-линия проходит рядом с положительной считывающей линией на половине длины и с отрицательной — на другой половине. Таким образом, наведённая помеха взаимно гасится.

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

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

Core-память компьютера Spacelab использовала архитектуру, отличную от типичной core-памяти, повышая производительность за счёт отказа от inhibit-линии. Эта архитектура называлась 2½D. Тем, кто знаком с core-памятью, отсутствие inhibit-линий может показаться странным: как тогда записать 1 в одни биты и 0 в другие? Хитрость состоит в наличии отдельной X-драйверной схемы для каждого бита. При записи данных X-линии возбуждаются только для битов, получающих 1; остальные линии остаются невозбуждёнными, так что биты сохраняют значение 0. Недостаток в том, что вместо одного набора X-драйверных схем требуется отдельный набор для каждого бита — в 18 раз больше для 18-битного слова. Однако с появлением драйверов сердечников на интегральных микросхемах стоимость дополнительной драйверной схемы стала менее значимой.

Система памяти использовала технику под названием «реверс фазы» (phase reversal), позволявшую сократить число вертикальных драйверов вдвое. Напомним, что пары вертикальных проводов соединены U-образным соединением. Возбуждая провод в определённом направлении, можно выбрать левую или правую сторону пары. Например, на схеме ниже показано, как два провода выбирают левый сердечник, но не правый. В левом сердечнике оба тока идут через сердечник в одном направлении, наводя магнитное поле в торе. Но в правом сердечнике два тока взаимно гасятся, поэтому магнитное поле не создаётся. Если же ток в вертикальной петле развернуть, будет выбран уже правый сердечник, а не левый. Смысл в том, что вместо двух драйверов для вертикальных проводов используется один, реверсирующий ток, чтобы выбрать левый или правый сердечник.

Соединение пар вертикальных проводов в U-образную петлю позволяет каждому драйверу управлять вдвое большим числом сердечников.

Соединение пар вертикальных проводов в U-образную петлю позволяет каждому драйверу управлять вдвое большим числом сердечников.

Диаграмма ниже показывает сложную разводку X-линий возбуждения. Каждая группа из 16 проводов соответствует одному биту 18-битного слова и имеет отдельный считывающий провод. Верхняя группа из 16 X-линий подключена к четырём контактам разъёма платы; каждый контакт связан с четырьмя X-линиями через изогнутые дорожки печатной платы. Нижняя группа из 16 X-линий подключена к диодным модулям на другой стороне платы через круглые переходные отверстия. (У каждого провода противоположные подключения — диодный модуль или разъём платы — на другом конце.) Одна группа из четырёх X-проводов возбуждается через разъём, а четыре провода возбуждаются через диодную матрицу, выбирая одну из 16 X-линий в группе.

Разводка печатной платы для X-линий.

Разводка печатной платы для X-линий.

Остальные платы блока памяти

Стек памяти состоит из семи плат: платы драйверов, четырёх плоскостей сердечников, второй платы драйверов и интерфейсной платы. Подробно эти платы пока не исследованы, но приведём предварительные сведения. На фото ниже — одна из двух плат драйверов. Она выдаёт высокотоковые импульсы для линий выбора X и Y. Плата плотно набита специализированными драйверными чипами для core-памяти, а также несколькими логическими чипами для управления драйверами. На ней отдельные драйверы для двух концов линий выбора, что обеспечивает описанную ранее матричную выборку.

Одна из двух плат драйверов памяти.

Одна из двух плат драйверов памяти.

Поскольку в стеке две платы драйверов и четыре платы core-памяти, вначале казалось логичным предположить, что каждая плата драйверов управляет двумя платами памяти. На деле конфигурация оказалась сложнее — с дополнительным уровнем матричной выборки, сокращающим число драйверов вдвое. Если упростить, X-линии на плате core-памяти можно считать имеющими левый и правый концы, оба из которых должны быть возбуждены для активации линии. Для левых концов первая плата драйверов питает платы памяти 1 и 2, вторая — платы 3 и 4. Правые концы перемешаны иначе: первая плата драйверов питает платы 1 и 3, вторая — платы 2 и 4. Таким образом, если первая плата драйверов питает и левый, и правый конец, единственной платой с обоими активными концами окажется плата 1. Если первая плата питает левые концы, а вторая — правые, активируется плата 2. Аналогично можно активировать плату 3 или 4. Смысл в том, что поскольку каждый набор драйверов подключён к двум платам памяти, требуется два набора драйверов вместо четырёх.

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

На интерфейсной плате есть немного неиспользуемого пространства в нижнем левом углу.

На интерфейсной плате есть немного неиспользуемого пространства в нижнем левом углу.

Выводы

Core-память прожила долгую жизнь, пережив переход компьютеров от электронных ламп к транзисторам, а затем к интегральным схемам, но в конце концов её вытеснила полупроводниковая память. В аэрокосмической технике core-память продержалась ещё дольше благодаря двум ключевым преимуществам перед полупроводниковой памятью: она сохраняла данные без питания и была устойчива к радиации. Компьютер Spacelab, изготовленный в 1980 году, застал закат эпохи core-памяти, поэтому он оказался более совершенным, чем типичная система такого рода, — с более высокой плотностью, широким применением интегральных схем и архитектурой 2½D. Но в итоге высокая плотность, низкая стоимость и низкое энергопотребление полупроводниковой памяти взяли верх. В 1991 году Space Shuttle начал летать с обновлёнными основными компьютерами IBM AP-101S, использующими полупроводниковую память вместо магнитных сердечников. Компьютеры Mitra в составе Spacelab тоже заменили — на AP-101SL, основанный на AP-101S, но модифицированный для поддержки системы команд и периферии оригинального компьютера Spacelab. Хотя core-память теперь прочно в прошлом, она до сих пор живёт в выражении «core dump».

Несмотря на наличие тире в тексте, при написании этой статьи ИИ не использовался.