Оригинальная Playstation 2, выпущенная 04.03.2000 в Японии, 26.10.2000 в Америке и 24.11.2000 в Европе
Краткое введение
Playstation 2 не была одной из самых мощных консолей своего поколения, однако смогла достичь уровня популярности, немыслимого для других компаний.
Эта машина даже близко не сравнится по простоте с первой Playstation, но вскоре мы узнаем, почему она не разделила судьбу рассмотренных нами ранее сложных консолей.
Материнская плата версии «GH-001» модели SCPH-10000, выпускавшейся только в Японии. Благодаря полученным донатам мне удалось купить эту модель и сделать качественное фото, чтобы идентифицировать большинство чипов. Предполагаю, что чип в нижнем правом углу — это BIOS ROM на 4 МБ
Оригинальный дизайн (реализованный в версии SCPH-10000). На каждой шине данных указаны ширина и скорость. Эта архитектура подвергалась множеству ревизий, о чём я расскажу ниже.
CPU
Сердцем этой консоли является спроектированный Sony мощный чипсет под названием Emotion Engine (EE), работающий с частотой примерно 294,91 МГц. Этот чипсет содержит множество компонентов, одним из которых является CPU, а остальные находятся в распоряжении CPU и предназначены для ускорения выполнения определённых задач.
Лидер
Основное ядро — это совместимый с MIPS R5900 ЦП, имеющий множество усовершенствований. Это первый чип, начинающий исполнять команды после включения консоли. Этот процесс обладает следующими особенностями:
- ISA MIPS III: 64-битный набор команд RISC. Постойте, я что-то путаю, или та же ISA использовалась в конкурирующей консоли?. Да, это так, но Sony усовершенствовала этот CPU, добавив часть команд из MIPS IV (выборку из памяти с упреждением и условную пересылку) вместе с собственным расширением команд SIMD под названием multimedia instructions («мультимедийные команды»).
- 32 дополнительных 128-битных регистра: ещё одно усовершенствование. Ими удобнее было управлять с помощью мультимедийных команд и они очень полезны для обработки векторов.
- Доступ к этим регистрам выполняется через 128-битную шину, а остальная часть CPU использует внутреннюю 64-битную шину.
- Двусторонняя суперскалярность: параллельно выполняется до двух команд.
- Кэш L1 на 24 КБ: разделён на 16 КБ для команд и 8 КБ для данных.
- Также он имеет функцию prefetch (выборки из памяти с упреждением) для кэширования команд и данных до того, как они будут запрошены. Это реализовано дополнительной схемой, определяющей, к каким областям памяти доступ выполняется чаще всего.
- Scratchpad RAM на 16 КБ: также называемая Fast RAM.
- Блок управления памятью: управляет доступом к памяти с остальной частью системы.
Ядро дополнено выделенным модулем обработки чисел с плавающей запятой (COP1), ускоряющим операции с 32-битными числами с плавающей запятой (в языке C называемыми
float
).Уже знакомая память
Рядом с Emotion Engine расположены два блока по 16 МБ RAM, в сумме дающие 32 МБ основной памяти. Используется тип памяти RDRAM (дежавю!), доступ к памяти осуществляется через 16-битную шину.
Структура памяти Emotion Engine. Можно догадаться, где будут возникать заторы.
Поначалу это может разочаровать, ведь внутренняя шина Emotion engine имеет ширину целых 128 бит. Однако оба чипа RAM продуманно расположены в соответствии с двухканальной архитектурой, заключающейся в подключении обоих чипов двумя независимыми 16-битными шинами (по одной шине на каждый чип) для повышения пропускной способности. В результате такая схема теоретически способна обеспечить скорость 3,2 ГБ/с, поэтому будьте уверены в том, что задержки памяти для этой консоли не проблема!
В сердце Emotion engine находится мощный контроллер DMA (DMAC), передающий данные между основной памятью и Scratchpad или между основной памятью и любым компонентом внутри EE. Передача данных выполняется пакетами по 128 бит и здесь есть интересный момент: Через каждые восемь пакетов основная шина временно разблокируется. Это создаёт небольшое окно для параллельного выполнения других передач DMA (до десяти) или для использования основной шины центральным процессором. Такой способ работы называется slice mode, он является одним из множества режимов, доступных для этого устройства DMA. Не надо забывать, что хотя этот slice mode снижает простои основной шины, ценой этого является общее замедление передач DMA.
Исправление ошибок прошлого
При таком объёме трафика, проходящего внутри Emotion Engine, эта архитектура начнёт страдать от последствий Unified memory architecture (UMA): несколько независимых компонентов пытаются одновременно получить доступ к основной памяти, создавая заторы. Чтобы устранить эти проблемы, Sony снизила потребность постоянного использования памяти следующими способами:
- Обернув процессоры большим объёмом кэша, благодаря чему доступ к памяти выполняется только в самом крайнем случае.
- 99% упоминаний кэша/scratchpad в статье будет связано с этим.
- Добавив 128-байтный буфер обратной записи: он очень похож на Write Gather Pipe, но вместо того, чтобы ждать своего заполнения на 25%, он выполняет запись в память, наблюдая за состоянием шины.
Это кажется очень удобным для приложений, способных пользоваться преимуществами кэша, но что насчёт тех задач, которые вообще не используют кэш, например, манипуляции с таблицами отображения (Display Lists)? К счастью, у ЦП есть другой режим доступа под названием UnCached, который использует только буфер обратной записи, не тратя такты на исправление кэша (которое происходит при промахах кэша). Более того, существует ускоренный режим UnCached, добавляющий буфер для ускорения считывания соседних адресов в памяти.
Другие интересные элементы
Внутри того же корпуса Emotion Engine есть ещё один процессор под названием Image Processing Unit (IPU), спроектированный для распаковки изображений. Он может быть полезным, когда игре нужно декодировать фильм в MPEG2, не загружая основной ЦП. Игра отправляет потоки сжатых изображений в IPU (по возможности с использованием DMA), а они потом декодируются в формат, который может отображать GPU. Операционная система PS2 также использует IPU для воспроизведения DVD.
Кроме того, IPU также позволяет манипулировать сжатыми текстурами высокого разрешения, что экономит ресурсы ЦП и позволяет избежать больших объёмов передаваемых данных.
Сопроцессоры
Прошло уже два года с тех пор, как конкуренты представили свой последний продукт. Если вы читали статью про Dreamcast, то, предполагаю, до сих пор ждёте упоминания того, что сделало PS2 такой мощной, какой она казалась в момент выпуска. Теперь я расскажу об очень важном наборе компонентов, которые Sony поместила в Emotion Engine — блоках Vector Processing Unit (VPU).
Vector Processing Unit — это небольшой независимый процессор, предназначенный для работы с векторами, в частности, с векторами, состоящими из четырёх значений
float
. Эти процессоры настолько быстры, что тратят на операцию всего один такт, что может быть чрезвычайно полезно для обработки геометрии.VPU состоят из следующих компонентов:
- Vector Unit: ядро процессора. Содержит немного памяти (называемой Micro Memory) для хранения программы (называемой Microprogram), которая сообщает блоку, как оперировать данными, находящимися во VU Mem.
- В нём используется 64-битная ISA, а блок исполнения разделён на два параллельных подблока. Первый умножает или складывает числа с плавающей запятой (float), а другой делит float или оперирует с целочисленными значениями (integer). Это позволяет параллельно оперировать и float, и integer.
- Немного Vector Unit Memory (VU Mem). Используется как рабочее пространство для Vector unit. Эта память хранит значения, с которыми нужно производить операции и/или результаты предыдущих операций.
- Vector Interface: автоматически распаковывает данные вершин, поступающие из основной памяти в формате, с которым может работать Vector unit. Также этот блок может передавать микропрограммы в Micro Memory.
Векторный блок нужно «завести», чтобы он начал работать; для этого основной ЦП передаёт нужный микрокод. В Emotion engine есть два VPU, но они имеют разную схему, что позволяет использовать их по-разному и оптимизировать работу.
Vector Processing Unit 0
Архитектура VPU0
Первый VPU, имеющий обозначение VPU0, расположен между ЦП и другим векторным блоком (VPU1). Он является «вспомогательным» для основного ЦП.
VPU0 имеет два режима работы:
- Micromode: традиционный режим, исполняющий «микрокоманды» (microinstructions) из микропрограммы (microprogram), хранящейся в Micro memory. При этом он работает независимо.
- Macromode: VPU0 превращается в COP2 основного ЦП и исполняет «макрокоманды» (macro-instructions), получаемые от основного ЦП через выделенную 128-битную шину.
- Макрокоманда имеет ту же функциональность, что и микрокоманды, но использует другие опкоды. Однако теперь блок исполнения VPU больше не разделён (то есть может исполнять за раз только одну команду).
- Хотя этот режим и не использует полностью все компоненты VPU0, он ускоряет векторные операции ЦП, к тому же сопроцессор программировать проще, чем отдельное устройство (это будет полезным для программистов на PC).
Схема распределения памяти VPU0 также имеет доступ к некоторым другим регистрам и флагам VPU, предположительно для того, чтобы проверять их состояние или быстро считывать результаты операций, выполненных другим VPU.
Vector Processing Unit 1
Архитектура VPU1
Второй VPU, называющийся VPU1 — это расширенная версия VPU0 с удвоенным объёмом микропамяти и памяти VU. Кроме того, в этом блоке есть дополнительный компонент под названием Elementary function unit (EFU), ускоряющий исполнение степенных и тригонометрических функций.
VPU1 расположен между VPU0 и Graphics Interface («шлюзом» к GPU), поэтому он содержит дополнительные шины для максимально быстрой передачи геометрии в GPU без использования основной шины.
VPU1, в том числе и из-за своего расположения, работает только в micromode.
Очевидно, что этот VPU оптимизирован под тригонометрические операции и может использоваться в качестве препроцессора GPU, обеспечивая передачу знаменитых таблиц отображения (Display Lists).
Бесконечные миры
Полезная техника, которую можно реализовать с помощью этих блоков — это процедурная генерация. Другими словами, вместо построения сцены из жёстко прописанной геометрии можно позволить блокам VPU генерировать её алгоритмически. В таком случае VPU вычисляет математические функции для создания геометрии, которая может интерпретироваться GPU (например, треугольников, линий, четырёхугольников и т.д.) и в конечном итоге использоваться для отрисовки сцены.
В отличие от заданных явным образом данных, процедурный контент идеально подходит для распараллеленных задач, он разгружает канал, требует очень мало места и является динамическим (использует параметры для достижения разных результатов). Некоторые элементы значительно выигрывают от использования этой техники:
- Сложные поверхности (например, сферы и колёса).
- Рендеринг мира (например, рельефы, частицы, деревья).
- Кривые Безье (очень популярное в компьютерной графике уравнение, используемое для отрисовки кривых), которые превращаются в поверхность Безье (явно заданную геометрию) и поддерживает разные степени точности в зависимости от требуемой детализации.
С другой стороны, процедурный контент может сталкиваться с трудностями при анимировании и если алгоритм слишком сложный, VPU может и не сгенерировать геометрию за требуемое время.
Подведём итог: процедурный рендеринг — не новая технология, но благодаря VPU он открывает возможности дальнейших оптимизаций и более качественной графики. Тем не менее, это непростая в реализации техника и научно-исследовательский отдел Sony опубликовал несколько статей о различных подходах, которые можно использовать на консоли компании.
Рабочий процесс выбираете вы
Благодаря этим новым возможностям программисты могут с большой гибкостью проектировать графические движки. Опубликовано множество статей, анализирующих бенчмарки архитектур популярных конвейеров.
Вот несколько примеров графических конвейеров с различными оптимизациями:
Архитектура параллельного конвейера
Архитектура последовательного конвейера
В первом примере (параллельная архитектура) ЦП (CPU) комбинируется с VPU0 в макрорежиме для создания геометрии параллельно с VPU1. Группа CPU/VPU0 полностью использует scratchpad и кэш, чтобы избежать использования основной шины, которую VPU1 использует для получения данных из основной памяти. В конце обе группы рендеринга паралелльно отправляют свои таблицы отображения в GPU.
Во втором примере (последовательная архитектура) используется другой подход, при котором группа CPU/VPU0 выполняет задачи препроцессора для VPU1. Первый этап получает и обрабатывает всю геометрию, которую VPU1 в дальнейшем превратит в таблицу отображения.
Существует и множество других примеров, поэтому программист сам может выбирать оптимальную схему, и это хорошо.
Частицы, составляющие пламя свечей и свет, падающий из окна. Crash Bandicoot: The Wrath of Cortex (2001 год)
Джон Бартон (бывший директор Travellers Tales) объяснил, как его команда реализовала систему частиц, полностью поместившуюся в VPU1. VPU1 получал из памяти предварительно заполненную базу данных, которая затем использовалась для вычисления координат частиц в текущий момент времени, результат можно было преобразовать в таблицы отображения и сразу же передать дальше.
Благодаря такой методике значительно снижена нагрузка на ЦП, что позволяет ему выполнять другие задачи, например, расчёт ИИ и физики.
Графика
Учитывая, что вся работа выполняется процессором Emotion Engine, остаются ли ещё какие-то задачи? На самом деле остаётся последний шаг: отображение на экране!
Final Fantasy X (2001 год)
В консоли есть простой, но скоростной чип, специализирующийся на этой функции: Graphics Synthesizer (GS), работающий с частотой примерно 147,46 МГц. Он содержит 4 МБ встроенной внутрь памяти DDRAM, чтобы выполнять всю обработку самостоятельно, избавляясь таким образом от необходимости доступа к основной памяти. Доступ к встроенной RAM выполняется при помощи различных шин, в зависимости от типа необходимых данных.
GS имеет меньше функций, чем ранее рассмотренные на этом сайте другие графические системы. Тем не менее, со своими задачами он справляется очень быстро.
Архитектура и конструкция
Этот GPU занимается только растеризацией, то есть генерацией пикселей, наложением текстур, применением освещения и некоторыми другими эффектами. Это означает, что в нём нет преобразований вершин (их выполняют VPU). Кроме того, он является конвейером с фиксированными функциями, поэтому в нём невозможны хитрые настройки или шейдеры, можно использовать только постоянную модель затенения (например, по Гуро).
Структура конвейера Graphics Synthesizer
Выглядит довольно просто, верно? Давайте подробнее рассмотрим, что происходит на каждом из этапов.
Препроцессинг
Этап препроцессинга
Emotion Engine запускает Graphics Synthesizer, заполняя встроенную DDRAM требуемыми материалами (битовыми картами текстур и таблицами поиска цветов, также известными под названием CLUT), назначает значения регистров GS, чтобы сконфигурировать его, а в конце отдаёт команды отрисовки (таблицы отображения), которые приказывают GS отрисовывать примитивы (точки, отрезки, треугольники, спрайты и т.п.) в нужных местах экрана.
Затем GS выполняет препроцессинг некоторых значений, которые потребуются для дальнейших вычислений. Самым важным из них является изначальное значение для Digital Differential Algorithm, который будет использоваться для интерполяций при отрисовке.
Растеризация
Этап растеризации
Используя предыдущие вычисленные значения, рендерер генерирует пиксели примитивов. Этот блок может параллельно генерировать 8 пикселей (с текстурами) или 16 пикселей (без текстур), и каждая запись пикселя содержит следующие вычисленные значения:
- RGBA: соответствует градиенту Red, Green, Blue и Alpha (прозрачности).
- Z-value: используется для проверки глубин на последующих этапах.
- Туман: для включения эффектов тумана.
- Свойства текстур: указывают адрес текстуры в DRAM и другие свойтва (координаты, уровень детализации, фильтрацию и т.п.), которые будут использоваться на следующем этапе.
Также на этом этапе выполняются Scissoring Tests для отбрасывания полигонов, находящихся вне области кадра (на основании из значений X/Y); некоторые свойства пикселей передаются на этап тестирования пикселей для дальнейших проверок.
Затем пакет передаётся в движок наложения текстур, но каждое свойство передаётся специализированному «субдвижку», что позволяет обрабатывать различные свойства параллельно.
Освещение также обеспечивается выбором одного из двух возможных вариантов, затенения по Гуро (Gouraud) и плоского (Flat).
Текстуры
Этап наложения текстур
Этот этап выполняется большим «пиксельным блоком» (Pixel Unit), способным одновременно вычислять до 16 пикселей. На этом этапе текстуры накладываются на полигоны. Кроме того, могут быть наложены эффекты тумана и сглаживания.
Карты текстур запрашиваются из DRAM в области, называемой буфером текстур (Texture Buffer), однако взаимодействие с ней обеспечивается отдельной областью, называемой буфером страниц текстур (Texture Page Buffer); похоже, она используется как механизм кэширования текстур. CLUT также накладываются с помощью этой системы страниц. Оба элемента передаются по 512-битной шине.
Pixel Unit выполняет коррекцию перспективы для наложения текстур на примитивы (это стало значительным усовершенствованием по сравнению с аффинным наложением PS1). Более того, он также обеспечивает билинейную и трилинейную фильтрацию, в дальнейшем она используется вместе с текстурами с mip-уровнями.
Тестирование
Этап тестирования пикселей
На этом этапе отбрасываются некоторые пиксели, не отвечающие определённым условиям. Выполняются следующие тесты:
- Альфа-тест: альфа-значение (прозрачность) пикселя сравнивается со «стандартным» значением. Это нужно, потому что в определённых случаях альфа-значение должно находиться в определённом диапазоне или быть больше/меньше произвольного значения.
- Тест альфа-значения результата: альфа-значение пикселя снова проверяется перед отрисовкой в буфер кадров.
- Тест глубин: Z-value пикселя сравнивается с соответствующим Z-value в Z-буфере. Это позволяет не обрабатывать пиксели, которые окажутся скрытыми за другими пикселями.
Постобработка
Этап постобработки
На последнем этапе могут применяться некоторые эффекты при помощи находящегося в DDRAM буфера кадров:
- Альфа-смешение: сливает цвета текущего буфера с предыдущим буфером в памяти.
- Дизеринг: большие значения RGBA необходимо урезать, поэтому для снижения потери точности можно применять дизеринг.
- Ограничение цветов: после применения таких операций, как альфа-смешение, новое значение RGB может превосходить допустимый интервал (0-255), поэтому ограничение (clamping) переносит значение в нужный интервал.
- Форматирование: этот эффект преобразует сгенерированный в конвейере готовый буфер кадров в формат, который можно хранить в памяти.
Затем новый буфер кадров с обновлённым Z-буфером записываются в памяти через 1024-битную шину.
Дополнительная постобработка
Внутри GS есть специализированный компонент под названием Programmable CRT Controller (PCRTC), передающий находящийся в памяти буфер кадров на видеовыход, чтобы кадр отобразился на экране телевизора. Но это ещё не всё: также он содержит в себе специальный блок под названием Merge Circuit, позволяющий выполнять альфа-смешение двух отдельных буферов кадров (это полезно, когда играм нужно повторно использовать предыдущий кадр для создания нового). Получившийся кадр можно вывести через видеосигнал и/или записать обратно в память.
Улучшенные модели
Благодаря описанным выше системам разработчики игр могли улучшить дизайн уже известных персонажей. Взгляните на эти сравнения:
Crash Bandicoot (1996 год) для PS1, 732 треугольника
Crash Bandicoot: The Wrath of Cortex (2001 год), 2226 треугольников
А вот персонажи из новых серий игр, изначально моделировавшиеся с высоким уровнем детализации:
Kingdom Hearts (2002 год), 2744 треугольника
Dragon Quest VIII (2004 год), 2700 треугольников
Стоит упомянуть, что в играх наподобие Dragon Quest реализована собственная модель освещения под названием Cel Shading (этот термин я уже упоминал ранее), однако в предыдущих статьях говорилось, что за это в основном отвечает GPU. В случае PS2 для реализации такой модели освещения требовались вычисления цветов, предположительно выполняемые Emotion Engine, поскольку GS не так гибок, как другие GPU.
Вывод видео
Как говорилось выше, PCRTC отправляет буфер кадров через видеосигнал; для совместимости с телевизорами из любых географических регионов он может транслировать видео в следующих форматах:
- PAL: передаёт до 640x512 пикселей с частотой 50 Гц, как в прогрессивном (576p) режиме, так и с чересстрочной развёрткой (576i).
- Ни одна из продаваемых игр не использует 576p. Хотя некоторые игры поддерживают прогрессивный режим, они обеспечивают разрешение всего 480p.
- NTSC: до 640x448 пикселей с частотой 60 Гц, или в прогрессивном (480p), или в чересстрочном (480i) режиме.
- VESA: до 1280x1024 пикселей.
- DTV: до огромного разрешения в 720x480 пикселей в прогрессивном режиме или 1920x1080 в чересстрочном режиме.
- Означает ли это, что PS2 может отображать HD-изображение? Теоретически это правда, но я не думаю, что большинство игровых студий рискнуло бы повышением требований ради формата, который ещё не был популярен.
Правая задняя часть консоли, на которой видны разъёмы питания, цифровой аудиоразъём и AV Multi Out
Консоль имела довольно много режимов, но основной вопрос заключался в популярности разных форматов в начале 2000-х, что сводило выбор только к PAL и NTSC. Кроме того, хотя PAL обеспечивал большее разрешение, чем NTSC, в некоторых европейских играх NTSC-игр использовалась обрезка кадра (letterboxing) для сокрытия неиспользуемых горизонтальных линий и замедление частоты обновления, чтобы уместиться в ограничение 50 Гц. Я называю такие игры «плохими портами»!
Разъём видеовыхода (Multi A/V) очень удобен. Он выводит сигнал RGB, компонентный, S-Video и композитный. То есть можно было использовать все важные сигналы без необходимости покупки проприетарных адаптеров и внутренних модификаций консоли.
Звук
Новый аудиочип стал усовершенствованной версией старого SPU и получил название SPU2. В список улучшений вошло появление 2 МБ внутренней памяти и наличие 48 каналов (в два раза больше, чем у PS1).
SPU2 состоит из двух процессоров обработки звука (называемых CORE0 и CORE1), работающих на частоте примерно 36,86 МГц и обрабатывающих по 24 канала.
Любопытно, что они по-прежнему являются двумя независимыми процессорами, конфигурируемыми изменением регистров, однако Sony предупредила разработчиков, что оба набора регистров должны задаваться с интервалом в 1/48000 секунды. Если слишком поторопиться, то поведение SPU2 становится непредсказуемым!
Он содержит те же эффекты, что и первый SPU. Память устройства используется в качестве «рабочей области»: в ней можно хранить сырые данные о сигнале и резервировать место для их обработки, а также применения к ним эффектов. Кроме того, чип может микшировать все каналы, обеспечивая стереовывод. А теперь об интересном: SPU2 может подавать на себя в качестве новых входящих данных микшированный стереосэмпл, что позволяет EE получать к нему доступ (например, чтобы микшировать его с дополнительным звуком) или продолжать добавлять новые эффекты.
Такие цифровые эффекты, как реверберация, эхо и задержка, можно реализовать циклическим обходом выходных данных CORE0, памяти и сэмплов, обрабатываемых в CORE1. Для этого требуется резервирование большой части памяти.
Без реверберации, Kingdom Hearts II (2005 год)
С реверберацией, Kingdom Hearts II (2005 год)
Сигнал выводится через Digital audio (называемый Sony/Philips Digital Interface, или S/PDIF) или через Analog Audio (проходящий через ЦАП и оканчивающийся разъёмом Multi A/V).
Ввод-вывод
Ввод-вывод PS2 несложен, однако многочисленные версии консоли полностью изменили различные внутренние и внешние интерфейсы.
Начнём с того, что в консоли есть специализированный процессор, управляющий коммуникациями между различными компонентами. Этот ЦП — не что иное, как оригинальное ядро на основе MIPS R3000, которое использовалось в Playstation 1. На этот раз он называется IOP, работает с частотой 37,5 МГц и использует 32-битную шину.
IOP обменивается данными с Emotion Engine при помощи специализированного интерфейса ввода-вывода под названием System Interface (SIF). Обе конечные точки для обмена данными друг с другом используют свои блоки DMA. Также IOP имеет собственную память, применяемую в качестве буфера. IOP предоставляет доступ к разъёмам на передней части устройства, к DVD-контроллеру, SPU2, BIOS ROM и разъёму PC card.
Унаследованная совместимость
Можно заподозрить, что благодаря использованию ЦП PS1 будет каким-то образом реализована совместимость с этой консолью. Очень удобно, что в IOP содержится остальная часть компонентов, образующая подсистему ЦП консоли PS1, а у ядра можно опустить частоту, чтобы оно работало со скоростью PS1. К сожалению, SPU2 слишком изменился по сравнению с версией из PS1, но для решения этой задачи используется Emotion Engine, эмулирующий старый SPU.
В последующих версиях консоли IOP был заменён на PowerPC 401 ‘Deckard’ и 4 МБ SDRAM (на 2 МБ больше, чем ранее). Обратная совместимость сохранилась, но уже была реализована программно.
Доступные интерфейсы
В этой консоли сохранились передние разъёмы, существовавшие в первой Playstation, однако появилась и пара «экспериментальных» интерфейсов, поначалу выглядевших очень многообещающе.
Передняя панель PS2, на которой видны стандартные разъёмы, в том числе для контроллеров и карт памяти, плюс новые USB и i.Link
Наиболее популярные нововведения: два порта USB 1.1, активно использовавшихся различными аксессуарами и сохранившиеся во всех последующих версиях.
А как насчёт «пропавших» разъёмов? Начнём с того, что существовал передний разъём i.Link (также известный под именем IEEE 1394, или Fireware в мире Apple). Этот разъём использовался для подключения двух PS2 и реализации локального мультиплеера и был удалён после третьей версии (предположительно, его заменили на Network card; см. подробности ниже).
На задней панели консоли есть разъём для PC card. Можно было купить Network Adaptor card производства Sony, обеспечивающую два дополнительных разъёма: один для подключения кабеля Ethernet, другой для подключения проприетарного и внешнего Hard Disk Drive Unit, также продававшегося Sony. Наличие жёсткого диска позволяло хранить временные данные игр (или даже устанавливать их туда) для ускорения загрузки. Однако эту функцию использовали очень немногие игры.
Отсек жёсткого диска на задней части PS2 (со снятой крышкой)
Передняя часть сетевого адаптера. Конкретно в этой модели есть разъёмы модема и ethernet
Сетевой адаптер, вид сзади, с установленным жёстким диском
Задняя панель slim-модели с несъёмным портом ethernet
В последующих версиях разъём PCMCIA заменили на отсек Expansion Bay, через который внутрь консоли можно было установить 3,5-дюймовый жёсткий диск. Для начала надо было купить сетевой адаптер, в котором присутствовали не только разъёмы модема и/или ethernet (в зависимости от модели), но и разъёмы, необходимые для подключения жёсткого диска ATA-66. В «Slim»-версиях эта особенность пропала, зато появился несъёмный разъём ethernet, находящийся на задней панели. Кроме того, в новой версии появился новый передний порт — инфракрасный датчик.
Интерактивные аксессуары
Новая версия контроллера, DualShock 2, является слегка усовершенствованной версией DualShock. Во времена первой Playstation было выпущено множество версий оригинального контроллера с различными функциями, а значит, возникла и разрозненность. Теперь ради удобства разработчиков, использовался единственный контроллер, в котором были стандартизированы все появившиеся ранее функции.
DualShock 2
Карта памяти
По сравнению с DualShock, новая версия имеет незначительный редизайн, два аналоговых стика и два вибромотора для удобства ввода.
Рядом с разъёмом контроллера расположен разъём карты памяти Memory Card, совместимый с картами PS1 и PS2. В новых картах встроены дополнительные схемы для повышения защиты, называемые MagicGate; они позволяют играм блокировать передачу данных между разными картами памяти.
Операционная система
На материнской плате установлен чип ROM на 4 МБ, хранящий большой объём кода, используемого для загрузки меню оболочки, с которой могут взаимодействовать пользователи; также он выполняет системные вызовы для упрощения доступа ввода-вывода, которые используются играми.
При загрузке ЦП исполняет команды в ROM, которые, в свою очередь:
- Инициализируют оборудование.
- Загружают ядро в ОЗУ, оно будет обрабатывать системные вызовы, а также обеспечит поддержку многопоточности (кооперативную и основанную на приоритетах).
- Запускают процессор IOP и отправляют ему модули, позволяющие IOP управлять оборудованием консоли. В конце IOP переключается в состояние ожидания команды.
- Использование модулей позволило Sony выпускать новые версии оборудования без изменения IOP, что снизило затраты на производство.
- Загружают модуль
OSDSYS
, отображающий анимацию заставки меню оболочки.
Анимация заставки после включения консоли
Логотип PS2, отображающийся после вставки диска с официальной игрой PS2
Интерактивная оболочка
Функциональность оболочки этой консоли очень походит на другие консоли того же поколения.
Первоначальное меню, когда не вставлен диск
Браузер карты памяти
Браузер сохранений после выбора карты памяти
Редактор сохранения после выбора сохранения
Системные конфигурации
В оболочке есть удобные разделы, позволяющие выполнять повседневные операции, например, управление сохранениями на карте памяти. Также в ней есть дополнительные опции, например изменение текущего видеорежима.
Игры
В нулевые эта консоль достигла беспрецедентного уровня популярности, поэтому к концу её срока жизни (в 2013 году, спустя 13 лет!) библиотека игр состояла из 1850 названий.
Когда кто-нибудь заявляет об изобилии игр для PS2, я вспоминаю вот эту, Mr Moskeeto (2001 год)
Такая популярность весьма впечатляет. PS2 не обладает особо «дружественной для разработчиков» архитектурой (с точки зрения программиста для PC), однако учитывая количество созданных игр, можно задаться вопросом, повлияли ли на это какие-то другие факторы (например, более мягкая лицензия, низкие затраты на распространение, стоимость разрабтки, маленький размер корпуса и т.д.).
Экосистема разработки
Для помощи в разработке игр Sony предоставляла оборудование и ПО.
ПО называлось Playstation 2 SDK и состояло из следующих элементов:
- Тулчейн Emotion Engine: набор компиляторов C и C++, ассемблеров, компоновщиков и отладчиков, используемых для управления каждой частью EE. Основной ЦП обычно программировали на C/C++, однако, код критичных для производительности компонентов, например, векторных блоков, писался на ассемблере (микрокод/макрокод).
- В пакет также входил «симулятор Emotion Engine», позволявший приблизительно тестировать код без передачи его на оборудование консоли, однако симулятор не был таким же точным, как физический чип EE.
- Все эти инструменты работали в Linux, Solaris и Windows. Выпущенный позже работал через среду Cygnus.
- Низкоуровневые библиотеки: обеспечивали интерфейс для многих системных функций (при помощи вызовов BIOS).
- Инструменты анализа для профилирования производительности.
- Дополнительные инструменты для соединения с официальным оборудованием для разработки.
Sony предоставляла студиям-разработчикам специализированное оборудование для запуска и отладки игр. Изначально комплекты разработки (devkit) представляли собой собранные вместе голые платы, напоминавшие невыпущенное оборудование PS2. Позже эти комплекты, называемые Development Tool, получили более презентабельный внешний вид, улучшенный ввод-вывод и соединили в одном устройстве оборудование рабочей станции (под управлением RedHat 5.2) и оборудование PS2 для сборки и выпуска игры.
Комбинация из Devkit, официального SDK и Codewarrior (знаменитого IDE) была очень популярной схемой.
Носитель
Дисковый привод мог считывать и DVD, и CD, поэтому игры можно было распространять в любом из этих форматов, но по очевидным причинам большинство продавалось на DVD.
Типичная розничная коробка и диск с игрой, Kingdom Hearts II (2005 год)
На DVD можно записать до 4,7 ГБ данных (в наиболее распространённой версии формата DVD-5) или 8,5 ГБ в случае DVD-9 (двуслойная версия, менее популярная). На самом деле, есть и третий формат, DVD-10, тоже двусторонний, но он не использовался ни для одной из игр.
Благодаря типу выбранного носителя можно было не только запускать игры, но и смотреть фильмы. Для этого требуется декодер, способный считывать формат фильмов DVD, и для этого необходимые части программы устанавливались на карту памяти PS2 (в конце концов, карта — это просто носитель для хранения данных), однако в более поздних версиях ПО DVD сразу устанавливалось в BIOS ROM.
Диски CD-ROM считывались со скоростью 24x (то есть 3,6 МБ/с), а DVD-ROM — со скоростью 4x (5,28 МБ/с).
Сетевой сервис
Как мы уже знаем, сетевые функции этой консоли были стандартизированы только в последующих версиях, появившихся спустя четыре года после первой версии. Поэтому если игровые студии решали предоставлять онлайн-услуги (например, мультиплеер), то они должны были самостоятельно обеспечивать всю необходимую инфраструктуру. В последующие годы Sony выпустила Dynamic Network Authentication System (DNAS). Это был не онлайн-сервер, а система авторизации, предотвращающая подключение пиратских игр к онлайну.
Необычный тип игры
Кроме всех этих игр с крутой графикой Sony выпустила дистрибутив Linux на основе Kondara (который, в свою очередь, был основан на Red Hat 6), поставлявшийся на двух DVD (первый диск назывался Runtime Environment, а второй — Software Packages), а также VGA-адаптер, USB-клавиатуру и мышь, плюс руководства разработчика. Этот комплект назывался Linux Kit, с его помощью можно было запустить ОС, сначала загрузившись с первого DVD, а затем выполнив все шаги, привычные для олдскульной среды Linux. Очевидно, что для этого требовалось подключение к консоли жёсткого диска; после установки на жёсткий диск для запуска ОС всегда требовался DVD.
Linux Kit содержал в себе компиляторы для EE (gcc 2.95.2 с glibc 2.2.2) и ассемблеры для векторных блоков, а также оконную систему (XFree86 3.3.6), «ускоряемую» устройством Graphics Synthesizer. В целом это кажется интересной средой. На самом деле, одна из статей, которые я читал при подготовке этого поста, была написана на такой конфигурации.
Защита от пиратства и Homebrew
Здесь нам многое предстоит обсудить, так что давайте начнём с привода DVD.
Защита от копирования
Этот аспект беспокоил игровые студии особенно сильно, потому что в консоли для хранения игр использовался очень доступный формат дисков с крайне высокой вероятностью пиратского копирования.
Этот экран с сообщением об ошибке мог появиться при неисправности привода… или если был вставлен пиратский диск
Когда ОС загружает игру, этот процесс выполняется передачей определённых команд приводу DVD. Команды, конкретно предназначенные для считывания контента игры, ведут себя сильно иначе, чем остальные команды (которые могут использоваться, например, для считывания фильма на DVD). Оказывается, официальные игры содержат во внутреннем разделе диска недоступный пользователю файл распределения памяти (map file), индексирующий файловую систему по имени, позиции и размеру. Когда привод DVD получает команду считать игровой диск, он всегда перемещается по диску с помощью map file, то есть спираченную копию игры, не содержащую этот файл, считать будет невозможно. Эта защита дополнена системой региональной блокировки, не позволяющей запускать импортированные игры на консоли из другого региона.
Обнаруженные возможности эксплойтов
Рассказывая о самой критически важной части консоли, давайте рассмотрим обнаруженные на протяжении срока её жизни способы, позволяющие обойти различные механизмы защиты.
Модчипы
Как и в случае с другими консолями того поколения (а также предыдущего) с дисковыми носителями, реверс-инжиниринг DVD-подсистемы с целью поиска эксплойта, заставляющего драйвер считывать файловую систему без необходимости map file, был всего лишь вопросом времени.
В конечном итоге эксплойты приняли облик модчипов, также устранявших региональную блокировку.
Читы
Наряду с модчипами, для установки которых требовались навыки пайки, на рынке появились неавторизованные, но «подлинные» диски, позволяющие обойти региональную защиту и использовать внутриигровые читы при помощи патчинга ОС. Они были удобны тем, что не требовали взлома консоли. Думаю, лучшим примером таких читов является CodeBreaker.
Подмена дисков
В процессе разработок появился ещё один трюк. На этот раз он эксплуатировал особенности работы со сбойными секторами считывающего устройства. Swap Magic выглядел как ещё один «подлинный» диск, но его «игра» приказывала DVD считывать несуществующий исполняемый файл, находящийся в произвольном сбойном секторе, что вызывало останов драйвера. Это окно возможностей позволяло пользователям заменить диск на пиратский. Затем Swap Magic, по-прежнему загруженный в память, запускал основной исполняемый файл нового диска, загружая в конце настоящую игру. При этом драйвер продолжал считать, что вставлен подлинный диск.
Такая методика не всегда требовала внесения изменений в консоль. Однако в некоторых моделях необходимо было вскрыть внешний корпус PS2, чтобы заблокировать датчики извлечения привода (в некоторых случаях достаточно было подложить в определённые точки вату).
Переполнение PS1
PS2 хранит на карте памяти файл базы данных под названием
TITLE.DB
, содержащий параметры для оптимизации эмуляции игр PS1. При вставке диска с игрой PS1 ОС запрашивает файл базы данных и загружает весь файл в фиксированный адрес памяти (первая ошибка). Парсер параметров реализован при помощи strncpy()
— функции языка C
, копирующей строки (последовательность символов) из одного места в другое.Люди, знакомые с языком
C
, вероятно, догадались, к чему я веду. Дело в том, что strncpy()
не знает длину строки, поэтому она не завершена (символом \0
в конце строки), копия продолжается «бесконечно» (с непредсказуемыми результатами!). К счастью, эта функция имеет дополнительный параметр, указывающий максимальное количество копируемых байтов, что защищает копирование от переполнения буфера. Как бы ни абсурдно это не звучало, Sony не использовала этот параметр, хотя каждой записи параметра задан размер 256 байт (вторая ошибка).При внимательном изучении ОЗУ становится ясно, что TITLE.DB копируется рядом с сохранённым регистром
$ra
, указывающим адрес возврата после завершения выполнения текущей функции (третья ошибка), что позволяет использовать эксплойт независимости: создать Title.db с длинной строкой, встроить в неё исполняемый файл и задать эту строку так, чтобы $ra
указывал на исполняемый файл. Если удастся загрузить этот файл на карту памяти (с помощью ещё одного эксплойта или USB-адаптера для PC), то можно получить простое средство запуска самодельных программ (Homebrew).После выпуска slim-версии эксплойт пропатчили (интересно, как?). Забавно, что это была не последняя халатность, позволившая выявить топорный код.
Полупостоянная разблокировка ПО
Какое-то время назад выяснилось, что BIOS консоли можно обновлять при помощи карты памяти. Эта функция никогда не использовалась на практике, но так и не была удалена (по крайней мере, в течение большей части срока жизни консоли). Благодаря этому хакеры обнаружили, что если удастся установить ПО на карту памяти, то BIOS всегда будет загружать его при запуске. Это открытие привело к созданию Free MCBoot — программы, выдающей себя за «данные обновления», заменяющая исходную оболочку на другую, способную исполнять Homebrew. Стоит помнить, что эти изменения не постоянны и применяются только если во время запуска консоли вставлена карта памяти с установленной Free MCBoot.
Кроме того, это ПО каким-то образом нужно установить, поэтому для запуска установщика требуется другой эксплойт (например, подмена диска).
Другие трюки с дисками
В год выпуска Free MCBoot был обнаружен ещё один трюк: маскировка игр под DVD-фильмы, что позволяет считывать пиратские копии игр без модчипа. Для этого достаточно пропатчить образ игры, добавив пустые метаданные и разделы, используемые только DVD-фильмами. Когда записанную на болванку копию игры вставляют в консоль, привод её не отвергает, но и не запускает игру. Однако при помощи Homebrew-программы под названием ESR игру можно запустить.
Источники/дополнительное чтение
Общая информация
CPU
- Официальный документ EE Overview Version 6.0
- Официальный документ EE User’s Manual Version 6.0
- Sony Playstation-2 VPU: A Study on the Feasibility of Utilizing Gaming Vector Hardware for Scientific Computing by Pavan Tumati
- Sound and Vision: A Technical Overview of the Emotion Engine by Jon “Hannibal” Stokes (архивированная статья с ArsTechnica)
- Джон Бартон рассказывает системе частиц в Crash и других играх
- Procedural generation: Procedural Rendering on Playstation 2, Робин Грин
Графика
- Официальный документ GS User’s Manual Version 6.0
- The Models Resource (архивировано)
Ввод-вывод
- Шины ввода-вывода (архивировано)
- Официальный документ EE Overview Version 6.0
Звук
- Официальный документ SPU2 Overview Version 6.0
Операционная система
Игры
- Объявление о выпуске Linux Kit
- Антология игр Gameradar
- Различные форматы DVD
- Обсуждение скоростей передачи на PsxPlace
- Анализ официального SDK
- Анализ разных Devkit
Защита от пиратства
- Список найденных хаков
- Game Console Hacking: Xbox, PlayStation, Nintendo, Game Boy, Atari and Sega, автор Джо Гранд.
Фотографии
- Консоль: Evan Amos Gallery (я убрал фон)
- Схемы, материнская плата, фотографии slim-модели и скриншоты игр: я