Архитектура PlayStation 2

Практический анализ от Rodrigo Copetti

Это перевод оригинальной статьи, выполненный добровольцами. Если вы заметили какие-либо ошибки, то, пожалуйста, помогите улучшить перевод. Спасибо!

Если вы используете инструменты специальных возможностей, электронные книги или устаревшие браузеры, то переключитесь на "классическую" версию.




Опорные изображения

Модель

Image
Оригинальная PlayStation 2.
Выпущена в 04/03/2000 в Японии, 26/10/2000 в Америке и 24/11/2000 в Европе

Материнская плата

Image
Материнская плата
На фото ревизия 'GH-001' от модели SCPH-10000, выпущенной только в Японии.
Благодаря полученной поддержке, я смог купить эту модель и заснять её плату, чтобы я смог определить большинство чипов.
Полагаю, микросхема снизу справа является ПЗУ BIOS на 4 МБ
Image
Материнская плата с помеченными важными частями

Диаграмма

Image
Диаграмма основной архитектуры
Оригинальный дизайн (реализован на ревизии 'SCPH-10000').
Каждая шина данных помечена ее шириной и скоростью.
Эта архитектура претерпела множество ревизий, подробнее ниже

Краткое введение

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

Эта консоль далеко не такая простая, как прошлая PlayStation, но мы посмотрим как ей удалось избежать судьбы предыдущих сложных консолей.


Процессор

В центре этой консоли находится мощный блок под названием Emotion Engine или ‘EE’, совместный проект Toshiba и Sony [1], работающий с частотой ~294.91 МГц [2].

Image
Emotion Engine, как видно на первой ревизии материнской платы этой консоли.

Этот чипсет содержит множество компонентов, одним из которых является основной процессор. Остальные находятся в распоряжении процессора для ускорения выполнения определённых задач. Для этого анализа мы разделим EE на три секции:

Ведущий

В двух словах, основной процессор - это MIPS R5900, эксклюзивное ядро MIPS, разработанное для этой консоли. Вы можете вспомнить, когда Sony начала экспериментировать с MIPS с самой первой PlayStation (где мы можем найти MIPS R3000A, вторично произведённый LSI). Для следующего поколения мы получили MIPS ‘R5900’… но что это имя значит для нас?

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

Опередив все ожидания

MIPS R4000 был популярной серией процессоров, принятой широким рядом систем, включая близкого конкурента. Благодаря своему успеху, MIPS привнесла ранее недоступные достижения (64-битные вычисления, 8-ступенчатые конвейеры и так далее) в массы.

Перенесёмся вперёд, следующий большой шаг вперёд случился в 1995 году с выпуском R10000. Теперь при финансировании от SGI MIPS выпустила новый процессор, который значительно улучшил параллелизм R4000, впервые внедрив такие техники, как [3]:

  • Спекулятивное выполнение: процессор предсказывает результат условных ветвлений до их вычисления. Прогнозы основываются на предыдущих результатах, хранящихся во внутренней таблице на 512 записей. Как только условие вычислено, если прогноз оказался верным, процессор сэкономил драгоценное время. В противном случае, дополнительные вычисления отбрасываются.
  • Конвейер с поддержкой 4 операций: Помимо конвейерной архитектуры, процессор будет теперь извлекать до четырёх инструкций в начале конвейера и распределять их по отдельным блокам, позволяя процессору выполнять эти инструкции одновременно. Таким образом, процессор достигает большей степени параллелизма.
  • Выполнение вне порядка: процессор также будет изменять последовательность инструкций, чтобы максимально загружать свои блоки (при условии, что не добавляются опасности).
  • Кэш L2 с 128-битной шиной, что позволяет загружать больше данных в процессор одновременно, что становится необходимостью в связи с предыдущими усовершенствованиями.

Тем не менее, такое новшество стоило сложного дизайна, и конечный продукт оказался совсем не дешевым. SGI включала его только в высококлассное оборудование, и любая попытка интегрировать его в домашнюю консоль была исключена.

Высококлассное для массов

Уже осознавая коммерческие ограничения R10000, SGI/MIPS наняли Quantum Effect Devices (QED) для разработки доступной версии R10000 для рынка среднего и низкого ценового сегмента. QED, будучи компанией, основанной бывшими сотрудниками MIPS, занималась разработкой вариантов ядер MIPS для бюджета.

В конечном итоге QED вернулась с новым ядром под названием R5000, это был R10000, подвергшийся значительным сокращениям [4]:

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

Таким образом, это стало идеальным процессором для экономичного оборудования, такого как низкопроизводительные рабочие станции SGI. В любом случае, обратите внимание, что урезанная конвейерная линия все еще выполняла параллельные операции с плавающей запятой, как будто QED планировали сохранить его привлекательным продуктом для векторных/3D приложений. Скоро вы увидите, что еще одна компания быстро заметила это.

Стоит отметить, что на другой стороне океана были похожие достижения, но в противоположном направлении: ARM объединилась с DEC в стремлении поднять ARM-чипы на рынок высококлассного оборудования.

Спецзаказ для Sony

Toshiba уже некоторое время была лицензиатом MIPS [5] и хорошо знала, как производить варианты MIPS и комплекты. В какой-то момент Sony и Toshiba объединились, чтобы создать процессор, специально разработанный для предстоящей консоли Sony. Это было огромным преимуществом для Toshiba: часто процессоры должны удовлетворять широкий спектр требований, поступающих от различных заинтересованных сторон, что ограничивает возможности для специализации. Теперь была только одна цель: 3D-игры. Таким образом, предоставляя достаточно места для всех видов инноваций.

Тогда Toshiba взяла доступный дизайн R5000 и изменила его, чтобы ускорить векторные операции. Новое ядро называется R5900 и включает следующие ‘3D’ улучшения [6]:

Кроме этого, мы находим и другие улучшения, которые разработчики могут также приветствовать:

Кроме того, ядро дополнено специализированным блоком с плавающей запятой (обозначенным как ‘COP1’), который ускоряет операции с 32-битными числами с плавающей запятой (также известными как floats в C). Это своеобразный блок, так как он не следует стандарту IEEE 754, наиболее очевидный отсутствием бесконечности (вычисляется как 0 вместо этого) [7]. В дополнение к этому, он имеет 32 32-битных регистра.

Узнаваемый выбор памяти

Рядом с Emotion Engine расположены два блока по 16 МБ ОЗУ, что в сумме дает 32 МБ основной памяти. Используется тип памяти RDRAM (déjà vu!), который доступен через 16-битную шину.

Image
Дизайн памяти Emotion Engine. Можете догадаться, где возникнут заторы.

Сначала это может разочаровать, учитывая, что внутренняя шина Emotion Engine имеет ширину до 128 бит. Однако, чипы оперативной памяти стратегически размещаются, соблюдая двухканальную архитектуру, которая состоит из подключения обоих чипов с использованием двух независимых 16-битных шин (по одной шине на чип) для улучшения пропускной способности данных. Полученная установка обеспечивает теоретическую скорость 3,2 ГБ/с, так что будьте уверены, что задержка памяти не является проблемой в этой консоли!

В одном углу Emotion Engine находится мощный DMA-контроллер или ‘DMAC’, который передает данные между основной памятью и Scratchpad; или между основной памятью и любым компонентом внутри EE.

Передача данных осуществляется пакетами по 128 бит, но вот интересная часть: каждые восемь пакетов основная шина временно разблокируется. Это оставляет небольшое окно возможностей для выполнения других передач DMA параллельно (до десяти) или позволяет ЦП использует основную шину. Этот modus operandi называется режим резки и является одним из многих режимов, доступных на этом блоке DMA. Имейте в виду, что режим резки уменьшает задержки на основной шине, но делает это за счет замедления общей передачи DMA.

Предотвращение прошлых ошибок

Независимо от того, хотим мы этого или нет, при таком объеме трафика внутри Emotion Engine этот дизайн в конечном итоге будет страдать от последствий унифицированной архитектуры памяти или ‘UMA’. Речь идет о: нескольких независимых компонентах, пытающихся получить доступ к основной памяти одновременно, вызывая перегрузку. Чтобы исправить эти проблемы, Sony ослабила постоянную потребность в памяти следующим образом:

Это звучит очень удобно для приложений, которые могут извлечь пользу из кэша, но что насчет тех задач, таких как манипуляция списками отображения, которые вообще не должны использовать кэш? К счастью, ЦП предоставляет другой режим доступа к памяти, называемый UnCached, который только использует буфер записи. Таким образом, он не будет терять такты на корректировку кэша (продукт промахов кэша).

Более того, также доступен ускоренный режим UnCached. Этот добавляет буфер для ускорения чтения непрерывных адресов в памяти.

Другие интересные моменты

В том же пакете Emotion Engine есть еще один процессор под названием Image Processing Unit или ‘IPU’, который предназначен для декомпрессии изображений. Как преемник MDEC, IPU может быть полезен, когда игре нужно декодировать видео MPEG2 без блокирования основного ЦП.

Короче говоря, игра отправляет сжатые потоки изображений на IPU (надеюсь, используя DMA), которые затем декодируются в формате, который GPU может отображать. Операционная система PS2 также использует IPU для обеспечения воспроизведения DVD.

Наконец, IPU также обрабатывает сжатые высококачественные текстуры, что экономит использование ЦП и уменьшает большие передачи данных.


Сопроцессоры

Прошло два года с тех пор, как конкуренты представили свои последние предложения. Если вы читали предыдущую статью и только начали читать эту, я полагаю, вы все еще ждете ‘того самого’, что делает PS2 такой мощной, как это казалось тогда. А теперь позвольте мне представить очень важный набор компонентов, установленных Sony в Emotion Engine, векторные вычислительные блоки или ‘VPU’.

Архитектура

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

ВПУ состоят из следующих компонентов:

Функционал

Чтобы начать работать, векторному блоку нужно ‘запуститься’. Для этого главный ЦП отвечает за предоставление микрокода.

В Emotion Engine установлены два ВПУ, но они расположены по-разному, что позволяет использовать их для разных задач и оптимизаций.

Векторный вычислительный блок 0

Image
Архитектура VPU0.

Первый ВПУ, VPU0, расположен между ЦП и другим векторным блоком (VPU1). Он выполняет вспомогательную роль для основного ЦП.

У VPU0 два режима работы:

  • Микрорежим: Это традиционный режим. VPU будет независимо выполнять микроинструкции из микропрограммы, хранящейся в микропамяти.
  • Макрорежим: VPU0 становится ‘COP2’ главного ЦП и выполняет макроинструкции, полученные от главного ЦП через выделенную 128-битную шину.
    • Макроинструкции имеют ту же функциональность, что и микроинструкции, но используют разные опкоды. Тем не менее, блок выполнения VPU больше не разделен (значит, он может выполнять только одну инструкцию за раз).
    • Хотя этот режим не полностью использует все компоненты VPU0, он все же ускоряет векторные операции ЦП. Более того, в плане простоты, сопроцессор проще программировать, чем независимый блок (что будет полезно программистам ПК).

Карта памяти VPU0 также имеет доступ к некоторым регистрами и флагам другого ВПУ, предположительно для проверки его состояния или быстрого чтения результатов некоторых операций, выполненных другим ВПУ.

Векторный вычислительный блок 1

Image
Архитектура VPU1.

Второй найденный VPU, VPU1, является улучшенной версией VPU0 с увеличенным количеством микро и VU памяти в четыре раза. Более того, этот блок включает в себя дополнительный компонент, называемый элементарным функциональным блоком или ‘EFU’, который ускоряет выполнение экспоненциальных и тригонометрических функций.

VPU1 расположена между VPU0 и Графическим интерфейсом (ворота к GPU), поэтому она включает в себя дополнительные шины, чтобы как можно быстрее передавать геометрию к GPU, не используя главную шину.

С другой стороны, из-за её расположения, VPU1 работает только в микрорежиме.

Очевидно, что эта VPU была разработана для тригонометрических операций и может служить предобработчиком для GPU. Поэтому её часто ставят ответственным за передачу знаменитых Списков отображения.

Бесконечные миры

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

По сравнению с использованием явных данных, процедурный контент идеально подходит для параллельных задач, освобождает пропускную способность, требует очень мало хранения и является динамическим (программисты могут устанавливать параметры для достижения различных результатов) [8]. Многие области могут существенно выиграть от этой техники:

С другой стороны, процедурный контент может испытывать трудности с анимацией, и если алгоритм слишком сложен, VPU может не создать геометрию вовремя.

Резюмируя, процедурный рендеринг - это не новая техника, но благодаря VPUs открываются двери для дальнейших оптимизаций и более насыщенной графики. Тем не менее, это не простая техника для реализации, и отдел исследований и разработок Sony опубликовал множество статей, описывающих различные подходы к использованию на их консоли [9].

Вы определяете рабочий процесс

С этими новыми дополнениями у программистов теперь есть большая гибкость в разработке своих графических движков. Для помощи в этом компания Sony потратила дополнительные ресурсы на разработку и документирование эффективных конструкций конвейеров. Ниже приведены примеры графических конвейеров, оптимизированных для различных типов рабочих нагрузок [10]:

Image
Параллельная конструкция конвейера.
Image
Последовательная конструкция конвейера.

В первом примере, Параллельной конструкции, CPU совмещается с VPU0 в макрорежиме для создания геометрии параллельно с VPU1. Группа CPU/VPU0 полностью использует свободное ОЗУ и кэш, чтобы избежать использования главной шины, которую VPU1 использует для получения данных из основной памяти. В конце обе группы рендеринга отправляют свои соответствующие Списки отображения на GPU одновременно.

Во втором примере, Последовательной конструкции, предлагается иной подход, при котором группа CPU/VPU0 работает как предобработчик для VPU1. На первом этапе будет извлечена и обработана вся геометрия, которую VPU1 будет затем преобразовывать в Список отображения.

До сих пор это были примеры с теоретической точки зрения, но чтобы объяснить более ‘практическую’ реализацию, я обращусь к видео Джона Бертона, опубликованному по поводу разработки одной из их игр для PS2 [11].

Image
Crash Bandicoot: The Wrath of Cortex (2001). Частицы создают пламя свечи и свет, исходящий от оконного стекла.

Бывший директор Travellers Tales объяснил, как его команда разработала полностью инкапсулированную систему частиц в VPU1. В общих чертах, VPU1 сосредоточилась на чтении предварительно заполненной базы данных из своей VU-памяти, которая использовалась для вычисления координат частиц в любой момент времени без зависимости от других компонентов. Результат операции можно было преобразовать в Списки отображения и сразу же отправить.

С этим подходом CPU была значительно разгружена, что позволило ей выполнять другие задачи, такие как ИИ и физика.

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


Графика

Учитывая всю работу, выполненную Emotion Engine, осталось ли что-нибудь еще? На самом деле последний шаг: Отображение!

Image
Final Fantasy X (2001).

Существует простой, но быстрый чип, специализирующийся на этом: Графический Синтезатор или ‘GS’, работающий на частоте ~147,46 МГц. В него встроено 4 МБ DRAM для обработки всех задач. Таким образом, отпадает необходимость в доступе к основной памяти. Встроенное ОЗУ (embedded RAM, eDRAM) соединяется с различными шинами в зависимости от типа необходимых данных.

GS имеет меньше возможностей, чем другие графические системы, ранее рассмотренные на этом сайте. Тем не менее, он очень быстр в том, что он делает.

Архитектура и строение

Этот GPU выполняет только растеризацию, и это… Генерация пикселей, картирование текстур, наложение освещения и некоторые другие эффекты. Это означает, что нет преобразований вершин (они обрабатываются VPUs). Также это конвейер с постоянной функцией, поэтому ни сложных настроек, ни шейдеров нет, вы ограничены фиксированной моделью затенения (например, Гуро).

Image
Дизайн конвейера Графического Синтезатора

Выглядит довольно просто, верно? Ну что ж, давайте углубимся, чтобы понять, что происходит на каждом этапе.

Предварительная обработка

Image
Стадия предварительной обработки.

Процессор Emotion Engine запускает синтезатор графики, заполняя его встроенную DRAM необходимыми материалами (битмапы текстур и таблицы поиска цвета, последние также известны как ‘CLUT’), назначая значения в регистрах GS для его настройки и, наконец, выдавая команды рисования (списки отображения), которые инструктируют GS рисовать примитивы (точки, линии, треугольники, спрайты и т.д.) в определенных местах экрана.

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

Растеризация

Image
Стадия растеризации.

Используя ранее рассчитанные значения, рендерер генерирует пиксели из примитивов. Этот блок может генерировать 8 пикселей (с текстурами) или 16 пикселей (без текстур) одновременно, каждый из которых содержит следующие рассчитанные свойства:

  • RGBA: Соответствующий градиент красного, зеленого, синего и альфа (прозрачности).
  • Z-значение: Используется для тестирования глубины на поздних стадиях.
  • Туман: Необязательный, для имитации тумана в окружающей среде.
  • Свойства текстуры: Содержит адрес текстуры в DRAM и другие свойства (координаты, уровень детализации, фильтр и т.д.), которые будут использоваться на следующем этапе.

Он также выполняет тесты на отсечение, чтобы отбрасывать полигоны вне области кадра (на основе их значений X/Y), некоторые свойства пикселей передаются на стадию ‘тестирования пикселей’ для дополнительных проверок. Освещение также обеспечивается выбором одного из двух доступных вариантов: Гуро и Равномерное.

Пакет затем передается в ‘двигатель текстурирования’, но каждое свойство обрабатывается специализированным ‘поддвигателем’, что позволяет обрабатывать различные свойства параллельно.

Текстурирование

Image
Стадия текстурного отображения

Эта стадия обеспечивается мощной пиксельной единицей, которая может обрабатывать до 16 пикселей одновременно, здесь текстуры будут наложены на полигоны (теперь пиксели). Кроме того, здесь применяются эффекты тумана и сглаживания.

Текстурные карты извлекаются из DRAM в области, определенной как буфер текстур, хотя это администрируется отдельной областью, называемой буфер страницы текстур, который, по-видимому, служит механизмом кэширования для текстур. CLUT также отображаются с использованием этой системы страниц. Оба элемента извлекаются с использованием 512-битной шины.

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

Тестирование

Image
Стадия тестирования пикселей

Здесь определенные пиксели будут отброшены, если они не соответствуют нескольким требованиям. Итак, выполняются следующие тесты:

  • Альфа тест: Сравнивает альфа значение (прозрачность) пикселя со ‘стандартным’ значением. Это связано с тем, что в некоторых случаях альфа значение должно находиться в определенном диапазоне или быть больше/меньше произвольного значения.
  • Тест альфа-значения точки назначения: Проверяет альфа-значение пикселя перед его отрисовкой в буфер кадра.
  • Тест глубины: сравнивает Z-значение пикселя с соответствующим Z-значением в Z-буфере. Это предотвращает обработку пикселей, которые будут скрыты за другими пикселями.

Пост-обработка

Image
Стадия пост-обработки

Последняя стадия может применить некоторые эффекты на наши новые пиксели, используя предыдущий буфер кадров, найденный в локальной DRAM:

  • Альфа смешивание: Объединяет цвета текущего буфера с предыдущим в памяти.
  • Дизеринг: Большие значения RGBA необходимо обрезать, чтобы сгладить потерю точности.
  • Ограничение цвета: После применения операций, таких как альфа-смешивание, новое значение RGB может превысить допустимый диапазон (0-255), поэтому ограничение устанавливает значение в пределах диапазона.
  • Форматирование: Это преобразует конечный буфер кадра, сгенерированный в конвейере, в формат, который может храниться в памяти.

В конце концов, новый буфер кадров вместе с обновленным Z-буфером записываются в память с использованием 1024-битной шины.

Еще больше пост-обработки

В GS есть специальный компонент, называемый программируемый контроллер ЭЛТ или ‘PCRTC’, который отправляет буфер кадров в памяти на видео выход, чтобы вы могли видеть кадр на экране телевизора. Но это еще не все: он также содержит специальный блок под названием Схема слияния, который позволяет альфа-смешивать два отдельных кадровых буфера (полезно, если игры хотят повторно использовать предыдущий кадр для формирования нового). Результирующий кадр может быть выведен через видеосигнал и/или записан обратно в память.

Лучшие модели

С учётом всего сказанного, это, конечно, принесло лучшее дизайны для обновления уже известных персонажей. Посмотрите на этот ‘До & После’:

КаркасПоверхностьТекстурированный
3D model
Crash Bandicoot (1996) для PS1.
732 треугольника.
КаркасПоверхностьТекстурированный
3D model
Crash Bandicoot: The Wrath of Cortex (2001).
2226 треугольника.

Вот персонажи из новых игровых серий, которые были смоделированы с высоким уровнем детализации с нуля:

КаркасПоверхностьТекстурированный
3D model
Kingdom Hearts (2002).
2744 треугольника.
КаркасПоверхностьТекстурированный
3D model
Dragon Quest VIII (2004).
2700 треугольника.

Стоит отметить, что игры, такие как Dragon Quest, реализовали пользовательскую модель освещения под названием Cel Shading (термин, который я упоминал раньше), однако в моих предыдущих статьях я объяснял, что за это в основном отвечает GPU. В случае PS2, предполагается, что необходимые цветовые вычисления выполняются Emotion Engine, так как GS не такой гибкий, как другие GPU.

Видеовыход

Как уже упоминалось ранее, PCRTC отправляет кадровый буфер через видеосигнал. Интерфейс может транслировать видео с использованием широкого диапазона форматов (чтобы работать с телевизорами из любого географического региона) [12]:

Image
Правая сторона консоли [13], вид сзади. Показаны порты питания, цифрового аудио и AV Multi Out.

Есть довольно много режимов на выбор, но все сводится к принятию формата в начале 2000-х годов, что сужает выбор до PAL и NTSC. Также, хотя PAL обеспечивал более высокое разрешение, чем NTSC, некоторые европейские версии NTSC-игр использовали letterboxing, чтобы скрыть неиспользуемые горизонтальные линии, и замедляли частоту до 50 Гц (я называю это ‘плохими портами’!).

Видео-выходной порт (Multi A/V) очень удобен. Он переносит RGB, компонентное, S-Video и композитное видео. Таким образом, все важные сигналы присутствуют без необходимости в проприетарных адаптерах или внутренних модификациях.


Звук

Новый аудио-чип является инкрементальным обновлением старого СПУ и называется… SPU2! Улучшения включают в себя добавление 2 МБ внутренней памяти и 48 доступных каналов (вдвое больше, чем в оригинале).

SPU2 состоит из двух звуковых процессоров внутри, называемых CORE0 и CORE1, и работает на частоте ~36.86 МГц. Каждый из них обрабатывает 24 канала.

Любопытно, что это до сих пор два независимых процессора, и для их настройки вам нужно изменить их регистры. Однако Sony предупредила разработчиков, что оба набора регистров должны быть установлены с интервалом в 1/48000 секунды. Если слишком торопиться, поведение SPU2 становится непредсказуемым!

SPU2 наследует те же эффекты, что и оригинальный SPU. Предоставляемая память используется в качестве ‘рабочей области’: вы можете хранить необработанные данные формы волн и выделять дополнительное пространство для их обработки и применения эффектов.

Наконец, чип может смешивать все каналы для предоставления стереовыхода. Теперь, вот что интересно: SPU2 может использовать смешанный стереосэмпл как новый ввод, что позволяет EE получить к нему доступ (чтобы смешать его с еще большим количеством аудио, например), или добавить больше эффектов (таких как реверберация, эхо и задержка).

Kingdom Hearts II (2005). Без реверберации.
Kingdom Hearts II (2005). С реверберацией.

Аудиовыход

Аудио сигнал выводится через два носителя:


Ввод/вывод

Изначально ввод/вывод PS2 не были особо сложными. Однако последующие ревизии этой консоли полностью изменили как внутренние, так и внешние дизайны. Так что в целом эта консоль демонстрирует множество форм ввода/вывода, распределенных по различным ревизиям.

Специальный ЦП

Для начала, есть специальный процессор, который арбитрирует связь между различными компонентами, этот ЦПУ не что иное, как оригинальное ядро на основе MIPS R3000, найденное в PlayStation 1. На этот раз он называется I/O Processor (IOP) и работает на частоте 37,5 МГц, подключаясь к 32-битной шине [14].

Image
Основная схема архитектуры PlayStation 2. Обратите внимание, что процессор ввода/вывода имеет эксклюзивный доступ к большинству устройств ввода/вывода.

IOP общается с Emotion Engine с использованием специализированного интерфейса ввода-вывода под названием Системный интерфейс или ‘SIF’. Оба конца используют свои DMA-модули для передачи данных друг другу. IOP также поставляется с выделенной памятью - 2 МБ EDO RAM (точно как в PS1) - используется в качестве буфера.

В общем, этот процессор обеспечивает доступ к фронтальным портам, контроллеру DVD, SPU2, BIOS ROM и слоту для PC-карт.

Как бы там ни было, через год после выхода ревизии ‘Slim’ (2005), IOP был заменен на SoC, который включает в себя PowerPC 401 ‘Deckard’ (урезанный PowerPC 601 для микроконтроллеров), 4 МБ SDRAM (на 2 МБ больше, чем раньше) и Ethernet трансивер (ранее встречавшийся в внешнем аксессуаре).

Наследственная совместимость

Для моделей с предшествующим процессором, можно предположить, что совместимость с PS1 будет частью комплекта. Как удобно, Sony действительно включила эмулятор PS1 (называемый PS1DRV), который загружается всякий раз, когда вставляется диск PS1. Когда это происходит, IOP работает на пониженной частоте, чтобы соответствовать скорости PS1, EE ‘перепрофилируется’ для эмуляции старого GPU, а SPU2 перенастраивается для работы как оригинальный SPU.

В моделях на базе PowerPC обратная совместимость сохранилась, но через полную программную реализацию.

Наличие интерфейсов

Эта консоль сохранила предыдущие фронтальные порты, которые были в оригинальной PlayStation, также включает пару ‘экспериментальных’ интерфейсов, которые поначалу казались многообещающими.

Image
Фронтальная часть PS2 с общими портами, включая контроллеры и карты памяти. Плюс, новые USB и i.Link порты [15].

Самыми популярными дополнениями являются два порта USB 1.1. Теоретическая скорость их работы составляет 12 Мбит/с, но это сильно зависит от пропускной способности IOP (которая, как правило, значительно ниже). Тем не менее, этот интерфейс был широко принят сторонними аксессуарами.

Однако, были и некоторые ‘эксперименты’, которые долго не продержались. Например, фронтальный i.Link порт (также известный как IEEE 1394 - или ‘FireWire’ в мире Apple). Этот порт использовался для соединения двух PS2 для локального многопользовательского режима, но был удален после третьей ревизии (предположительно заменен на ‘Сетевую карту’, больше деталей ниже).

Необычный комбо Ethernet + HDD

На задней стороне консоли также был слот для PC карт. Для этого можно было купить ‘Сетевую карту’ от Sony, которая предоставляет два дополнительных интерфейса:

В более поздних ревизиях, порт PCMCIA был заменен на Expansion Bay, куда теперь мог устанавливаться 3,5” жесткий диск внутри консоли. Сначала нужно было купить Сетевой адаптер, который не только предоставлял Модем и/или Ethernet порты (в зависимости от модели), но также включал разъемы для подключения ATA-66 жесткого диска.

Image
Задняя часть PS2, показывающая отсек расширения (снята крышка) [16].

Внутри данные на HDD структурированы с использованием файловой системы под названием ‘PFS’ [17]. Странно, но планировка не содержит таблицы разделов, только очень примитивный каталог под названием ‘Aligned Partition Allocation’ (APA). Возможно, это связано с тем, что Sony поставляла только жесткие диски на 40 ГБ. Таким образом, масштабируемость не входила в их список приоритетов.

Image
Сетевой адаптер, вид спереди [18]. Эта модель предоставляла порты модема и Ethernet.
Image
Сетевой адаптер, вид сзади [19], с установленным жестким диском.

Эфирный трансивер в адаптере поддерживает скорость передачи до 100 Мбит/с (12,5 МБ/с). Однако, наблюдаемая скорость значительно ниже (в некоторых случаях до 2 МБ/с). Объяснение этому довольно простое: для достижения работоспособной сетевой связи требуется реализовать все уровни стандартной ‘модели OSI’; и передатчик - это всего лишь одна часть головоломки. Остальное часто делегируется IOP (таким образом, выполняется в программном обеспечении), но из-за ограниченной производительности IOP [20] это приводит к узким местам.

Уменьшение размеров

Ревизия Slim пересмотрела всю модель Ethernet + HDD: больше нет Expansion Bay, но Ethernet порт установлен на задней части консоли (определенные модели также включали Модем).

Image
Задняя часть модели Slim с постоянным Ethernet портом.

Кроме того, новая ревизия добавила новый инфракрасный сенсор, который используется с фирменным пультом дистанционного управления Sony (продается отдельно).

Интерактивные аксессуары

Новая версия их контроллера, DualShock 2, немного улучшенная версия DualShock.

Image
Контроллер DualShock 2 [21].
Image
Официальная карта памяти (модель 8 МБ) [22].

Во времена оригинальной PlayStation были выпущены несколько ревизий оригинального контроллера с различными функциями (что также привело к фрагментации рынка). Теперь для удобства разработчиков появился единый контроллер, который объединил все предыдущие свойства.

По сравнению с оригинальным DualShock, новая версия имеет небольшой редизайн, включает два аналоговых стика и два вибрационных мотора для более богатого ввода и обратной связи соответственно.

Рядом со слотом для контроллера находится слот для карты памяти, теперь совместимый с картами для PS1 и PS2. Последние карты встраивают дополнительную схему для целей безопасности, которая называется MagicGate, что позволяет играм ограничивать передачу данных между различными картами памяти. IOP отвечает за шифрование и дешифрование содержимого, и делает это при помощи чипсета MagicGate (расположенного внутри карты памяти) и DVD-дисковода, последний содержит ключи шифрования.

Некоторые карты памяти от сторонних производителей не поддерживали MagicGate.


Операционная система

На материнской плате установлен чип с 4 МБ ПЗУ, который содержит значительное количество кода, используемого для загрузки меню оболочки (с которым могут взаимодействовать пользователи), а также предоставляет системные вызовы для упрощения доступа к вводу/выводу [23] (на который опираются игры).

Image
Начальная анимация при включении консоли.
Image
Логотип PS2, показываемый после вставки действительной игры PS2.

При получении питания и MIPS R5900, и IOP начнут работу с адреса 0xBFC00000 (это сигнатурный вектор сброса для всех MIPS ЦПУ). Чтобы справиться с ожидаемыми конфликтами, код, хранящийся по этому адресу (указывает на BIOS ПЗУ), заставит каждый ЦПУ ветвиться в разные места на основе его идентификатора.

В случае с R5900, ЦПУ будет следовать этим шагам [24]:

  1. Инициализировать оборудование.
  2. Загрузить ядро из ПЗУ в ОЗУ. После загрузки ядро предоставит слой абстракции для приложений (в основном игр) для взаимодействия с оборудованием. Кроме того, оно также предоставляет многопоточную API (кооперативную и основанную на приоритетах).
  3. Ядро загружает EELOAD, модуль ядра, который, в свою очередь, загружает OSDSYS. Последний представляет собой программу, которая отображает анимацию заставки и меню оболочки.

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

Стоит отметить, что использование модулей позволяет Sony выпускать новые аппаратные ревизии PS2 без изменения IOP (до тех пор, пока они это делали), таким образом снижая затраты на производство.

Интерактивная оболочка

Функциональность оболочки PS2 находится примерно на уровне остальных консолей шестого поколения.

Image
Начальное меню. Появляется, когда диск не вставлен.
Image
Браузер Memory Card.
Image
Браузер сохранений. Появляется после выбора карты памяти.
Image
Редактор сохранений, отображаемый после выбора сохранения.
Image
Конфигурация системы.

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

Обновляемость

БИОС действительно хранится в памяти только для чтения, но это не помешало Sony внести в него изменения после выхода с завода. Видите ли, за кулисами, БИОС оставил две двери открытыми для будущих изменений:

В любом случае, Sony в конечном итоге удалила второй метод в поздних моделях PS2 (с версией BIOS 2.30). Полагаю, Sony больше не собиралась делать обновления, тем более это увеличивало поверхность атаки.


Игры

Невероятный уровень популярности, достигнутый этой системой в нулевых годах. К концу её жизненного цикла (2013 год, спустя 13 лет!) библиотека игр насчитывала 1850 названий [28].

Image
Mr Moskeeto (2001). Когда кто-то спорит о множестве игр для PS2, я вспоминаю эту игру.

То, что здесь произошло, действительно впечатляет. У PS2 нет ‘дружественной программисту’ архитектуры (с точки зрения программиста ПК), но с таким количеством разработанных игр, мне тоже интересно, не было ли здесь других факторов (таких как ‘лицензионные послабления’, низкие затраты на распространение, затраты на разработку, маленький форм-фактор и так далее).

Экосистема разработки ПО

Sony предоставила аппаратное и программное обеспечение для поддержки разработки игр.

С точки зрения программного обеспечения, был PlayStation 2 SDK, который включал [29]:

С точки зрения аппаратного обеспечения, Sony предоставила студиям специальное оборудование для запуска и отладки игр на месте. Начальные девкиты представляли собой голые платы, сложенные вместе, чтобы воссоздать не выпущенное оборудование PS2. Поздние наборы (названные Development Tool) имели более презентабельный вид, улучшенный ввод/вывод и комбинированное рабочее оборудование (работающее под управлением RedHat 5.2) с оборудованием PS2 для создания и развёртывания игры в одном корпусе [30].

Сочетание Devkit, официального SDK и CodeWarrior (известного IDE) было одной из самых популярных конфигураций.

Носитель

Дисковод может читать как DVD, так и CD, поэтому игры можно было распространять в любом формате, но по понятным причинам, большинство игр выпускались на DVD.

Image
Kingdom Hearts II (2005). Типичная коробка для розничной продажи игры и диск.

DVD-диски могут вмещать до 4.7 ГБ данных в случае DVD-5 (наиболее распространенный ‘субформат’) или 8.5 ГБ в случае DVD-9 (двухслойная версия, менее распространенная) [31]. Фактически существует третий формат, DVD-10, который является двухсторонним, но ни одна коммерческая игра его никогда не использовала.

Из-за типа используемого носителя можно было проигрывать не только игры, но и фильмы. Для этого требуется декодер для чтения формата DVD-фильмов, и поэтому PS2 изначально включала необходимые элементы, установленные на карте памяти (в конце концов, карта - это просто носитель), но поздние модели поставлялись с предустановленным программным обеспечением для DVD в ПЗУ BIOS.

По скорости CD-ROM считываются со скоростью 24x (3.6 МБ/с), а DVD-ROM со скоростью 4x (5.28 МБ/с) [32].

Сетевой сервис

Как вы видели, сетевые функции этих консолей не были стандартизированы до более поздних ревизий, которые появились через четыре года после первого выпуска. Аналогично, студии разработчиков игр несли ответственность за обеспечение необходимой инфраструктуры, если они решали предоставлять онлайн-сервисы (например, многопользовательскую игру). В более поздние годы Sony внедрила Dynamic Network Authentication System или ‘DNAS’, это была не онлайн-сервер, а система аутентификации, предотвращающая подключение пиратских игр к сети.

Необычная игра

Помимо всех этих игр с их яркой графикой, Sony выпустила дистрибутив Linux на основе ‘Kondara’ (который в свою очередь основан на Red Hat 6), доступный на двух DVD (первый диск называется ‘Runtime Environment’, а второй - ‘Software Packages’) вместе с VGA адаптером, USB-клавиатурой и мышью; плюс некоторые руководства разработчика. Комплект был известен как Linux Kit и вы могли запускать ОС, загрузив первый DVD и затем продолжать как в любой старой среде Linux. Для установки дистрибутива Linux вам, очевидно, понадобился жёсткий диск, установленный в консоль. После установки всегда требовался первый DVD для загрузки этой ОС.

Набор Linux включал компиляторы, нацеленные на EE (gcc 2.95.2 с glibc 2.2.2), и ассемблеры для векторных блоков, вместе с оконной системой (XFree86 3.3.6) ‘ускоренной’ в Graphics Synthesizer [33]. В целом, это звучит как интересная среда. Фактически, одна из научных статей, которые я читал при написании этой статьи, была выполнена с использованием этой среды.


Борьба с пиратством и хоумбрю

Здесь есть о чем поговорить, так что давайте начнем с DVD-привода, хорошо?

Защита от копирования DVD

Эта область особенно беспокоила игровые студии, так как эта консоль использовала очень доступный формат дисков для распространения игр. Таким образом, риск пиратства был высок.

Image
Этот экран ошибки мог появиться если привод неисправен… или вставлена пиратская копия.

Когда ОС загружает игру, она делает это, отправляя специальные команды приводу DVD. Команды, используемые для чтения содержимого игры, работают совершенно иначе, чем стандартные команды DVD (например, для чтения DVD-фильма). Оказывается, авторизованные игры содержат недосягаемый ‘файлообразующий файл’ во внутренней части диска, который индексирует файловую систему по имени, позиции и размеру. Когда DVD-привод запрашивает чтение игрового диска, он всегда навигирует по диску, используя файлообразующий файл, что делает невозможным чтение пиратской копии игры, которая не может включать этот файлообразующий файл.

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

Обход защиты

Объяснив наиболее критичные части этой консоли, давайте рассмотрим несколько методов, которые были обнаружены (и коммерциализированы) для обхода защитных механизмов.

Атака на DVD-привод

Как только PS2 поступила в магазины, появилось множество продуктов третьих сторон, обещающих ‘разблокировать’ DVD-привод. Не поддерживая Homebrew (кроме Linux решения), пиратство стало главным бенефициаром.

Чиповка

Как и с любой другой консолью своего поколения (и предыдущих поколений) используя дисковую систему, рано или поздно компании третьих сторон обратной инженериирании DVD подсистемы. Цель здесь заключалась в нахождении эксплоита, который мог бы заставить драйвер навигировать по файловой системе без необходимости использования недоступного файла карты.

Это в конечном итоге материализовалось в виде мод-чипов, которые также снимали проверки защиты от копирования и ограничения по региону.

Читы

Вместе с мод-чипами, которые требовали навыков пайки для их установки, на рынке появились несанкционированные, но ‘подлинные’ диски. Эти диски патчили ядро, чтобы снять региональную защиту и использовать игровые чит-коды.

Самое главное, ‘чит-диски’ имели преимущество в том, что не требовали никакой модификации консоли. Думаю, лучший пример, который можно упомянуть, это CodeBreaker.

Замена дисков

Посреди последних достижений появился еще один трюк. На этот раз, эксплуатируя обработку поврежденных секторов. Swap Magic выглядел как еще один ‘подлинный’ диск, но его ‘игра’ заставляла DVD считывать несуществуемый исполнимый файл, находящийся в специально поврежденном секторе, полностью останавливая драйвер [34]. Это окно возможностей позволило пользователям заменить диск на нелицензионный. Затем Swap Magic, еще загруженный в память, загружал основной исполняемый файл нового диска, загружая настоящую игру в конце. Все это происходит, пока привод все еще считает, что вставлен лицензионный диск.

Это не обязательно требует изменения консоли. Тем не менее, в зависимости от модели, внешнюю часть PS2 придется подделать, чтобы заблокировать датчики извлечения привода. В некоторых моделях частью пошагового руководства было размещение кусочков хлопка в определенных местах.

Отказ от мод-чипов

Со временем было собрано и распространено больше исследований об этой консоли. Следовательно, новые и более сложные открытия привели к новой волне разработок, которые больше не полагались на внешнее оборудование, по крайней мере в основном. Более того, пиратство уже не было главным фокусом. Вместо этого способность запускать программы третьих сторон без одобрения Sony (называется Homebrew) быстро стала одной из главных целей.

Переполнение независимости

PS2 хранит файл базы данных под названием TITLE.DB на MemoryCard, который содержит информацию, используемую для оптимизации эмуляции игр PS1 [35]. Когда вставляется игра PS1, ОС извлекает файл базы данных и загружает весь файл в память по фиксированному адресу (первый фол). Парсер информации реализован с использованием strncpy(), функции на языке программирования C, которая копирует строки (цепочки символов) из одного места в другое.

Для тех, кто знаком с C, вы, наверное, догадались, о чем я говорю. Дело в том, что strncpy() не знает, какой длины строка, поэтому, если строка не завершается (путем добавления \0 в конец цепочки), копирование продолжается ‘вечно’ (с непредсказуемыми результатами!). К счастью, эта функция содержит необязательный параметр, который указывает максимальное количество байтов для копирования, защищая копирование от переполнения буфера. Как бы абсурдно это ни казалось, Sony не использовала этот параметр, хотя каждая запись в базе данных имеет фиксированный размер в 256 байт (второй фол).

При ближайшем рассмотрении в ОЗУ, оказывается, что файл TITLE.DB копируется рядом с сохраненным регистром, $ra, который указывает адрес возврата после завершения выполнения текущей функции (третье предупреждение), что приводит к эксплойту независимости [36]: Создайте файл TITLE.DB с длинной строкой, встроите в него исполняемый файл и спроектируйте эту строку так, чтобы $ra был перезаписан и указывает на исполняемый файл. Если вам удастся загрузить этот файл на вашу Memory Card (через другой эксплойт или адаптер USB для ПК), у вас будет простой «загрузчик» Homebrew.

Это открытие было опубликовано в 2003 году. Следовательно, с выпуском slim-версии, Sony добавила новую версию BIOS ROM, исправляющую этот эксплойт. Достаточно любопытно, что это не была последняя ошибка, которая обнажила неуклюжий код.

Эксплойт с подписью

В ноябре 2007 года хакерская группа начала продавать Memor32 [37], еще одну обычную карту памяти от третьей стороны, за исключением того, что по какой-то причине она содержала FPGA и USB-порт. Только после появления прошивки под названием Memento на интернет-форумах стало ясно, для чего на самом деле предназначен Memor32: запускать неавторизованные исполняемые файлы с карты памяти, как и эксплойт Independence.

Реализация Memento основывалась на уязвимости в проверке подписи DVD-плеера. Было обнаружено, что, хотя двоичные файлы должны быть подписаны с помощью ключей Sony, целостность двоичного файла не проверяется. Таким образом, любой мог заменить исполняемый код чем-то другим (если это помещается в то же пространство), и операционная система с радостью его исполняла бы. Прошивка Memento использовала этот эксплойт, чтобы замаскировать свою нагрузку в DVD-плеере и включала несколько утилит, которые позволяли пользователям загружать игры (либо с дисковода, либо с HDD).

Однако популярность Memor32 и Memento вскоре снизилась после появления бесплатной (и первоначально с открытым исходным кодом) альтернативы: FreeMCBoot.

Универсальное решение

Как только Memento было разобрано, в интернете появилась альтернатива, не требующая Memor32. FreeMCBoot использовал ту же уязвимость, за исключением того, что его можно было установить на любую карту памяти MagicGate. Единственным недостатком было то, что для загрузки установщика все еще требовался другой эксплойт (например, замена диска).

Что интересно, интерфейс пользователя FreeMCBoot заимствует элементы из OSDSYS, предоставляя знакомое меню для запуска других программ Homebrew. Он также патчит Kernel для добавления API для доступа к устройствам хранения данных в портах USB 1.1, что многие приложения homebrew используют для поиска дополнительных файлов.

Кроме того, установщик предлагает два варианта: установить только необходимые файлы для текущей консоли или установить глобальную настройку для всех вариантов PS2. Любопытно, но последний вариант был сложен для выполнения [38]. Изначально установщик изменял таблицу разделов карты памяти, чтобы избежать нехватки места, что не было особенно безопасным.

Как это ни странно, в 2011 году система безопасности PlayStation 3 была компрометирована, раскрывая множество секретов. Среди прочего, была раскрыта коллекция ключей MagicGate, глобально используемых для обратной совместимости с PS2. С тех пор больше не было необходимости прибегать к ограниченному трюку с подписью двоичных файлов DVD для создания исполняемых файлов PS2. Таким образом, начиная с версии 1.8b, FreeMCBoot сохраняет свою позицию как самый безопасный и популярный метод запуска любого типа homebrew на PlayStation 2.

Дальнейшие разработки

Как только возможность запуска Homebrew стала более доступной, работа продолжилась в виде доработки предыдущих эксплойтов и разработки приложений Homebrew. Некоторые из последних в конечном итоге способствовали пиратским действиям, но также расширили ограниченные возможности операционной системы (например, предоставляя патчи для игр), в конечном итоге это зависело от намерений пользователей.

Вот несколько примечательных примеров разработок, связанных с homebrew:

В последующие годы будут обнаружены новые уязвимости:


Вот и всё, ребята

Поздравляю и благодарю за то, что дочитали статью до конца! Честно говоря, было так много тем для обсуждения, что я сомневался, не устанут ли читатели от материалов, связанных с PlayStation, к моменту завершения этого.

В любом случае, серьезно, я надеюсь, что вы узнали что-то новое после прочтения этой статьи, и если у вас есть какие-либо комментарии, не стесняйтесь <a href=“code>r ref(about_url, root = TRUE) связаться со мной.

Увидимся в следующий раз!
Родриго


Помощь проекту

Эта статья является частью серии Архитектура консолей . Если вы нашли ее интересной, пожалуйста, подумайте о пожертвовании. Ваш взнос будет использован для финансирования покупки инструментов и ресурсов, которые помогут мне улучшить качество существующих и предстоящих статей.

Donate with PayPal
Become a Patreon

Вы также можете купить цифровую версию книги на английском языке. Я отношусь к прибыли как к пожертвованиям.

Image

Перечень желательных инструментов и последних приобретений для этой статьи отслеживается здесь:

### Interesting hardware to get (ordered by priority)

- Hard drive/Network card for the SCPH-10000.
- PS2 SCPH-3x00x model to check out Homebrew using the hard drive.

### Acquired tools used

- PS2 SCPH-10000 (£60) to do a proper motherboard analysis.
- Old PS2 Slim grey (£40?) from back then.

В качестве альтернативы, вы можете помочь, предлагая изменения и/или добавляя перевод.


Copyright and permissions

This work is licensed under a Creative Commons Attribution 4.0 International License. You may use it for your work at no cost, even for commercial purposes. But you have to respect the license and reference the article properly. Please take a look at the following guidelines and permissions:

Article information and referencing

For any referencing style, you can use the following information:

For instance, to use with BibTeX:

@misc{copetti-ps2,
    url = {https://www.copetti.org/writings/consoles/playstation-2/},
    title = {PlayStation 2 Architecture - A Practical Analysis},
    author = {Rodrigo Copetti},
    year = {2020}
}

or a IEEE style citation:

[1]R. Copetti, "PlayStation 2 Architecture - A Practical Analysis", Copetti.org, 2020. [Online]. Available: https://www.copetti.org/writings/consoles/playstation-2/. [Accessed: day- month- year].
Special use in multimedia (Youtube, Twitch, etc)

I only ask that you at least state the author’s name, the title of the article and the URL of the article, using any style of choice.

You don’t have to include all the information in the same place if it’s not feasible. For instance, if you use the article’s imagery in a Youtube video, you may state either the author’s name or URL of the article at the bottom of the image, and then include the complete reference in the video description. In other words, for any resource used from this website, let your viewers know where it originates from.

This is a very nice example because the channel shows this website directly and their viewers know where to find it. In fact, I was so impressed with their content and commentary that I gave them an interview 🙂.

Appreciated additions

If this article has significantly contributed to your work, I would appreciate it if you could dedicate an acknowledgement section, just like I do with the people and communities that helped me.

This is of course optional and beyond the requirements of the CC license, but I think it’s a nice detail that makes us, the random authors on the net, feel part of something bigger.

Third-party publishing

If you are interested in publishing this article on a third-party website, please get in touch.

If you have translated an article and wish to publish it on a third-party website, I tend to be open about it, but please contact me first.


Источники / Продолжить чтение

Борьба с пиратством

Процессор

Игры

Общее

Графика

Ввод/вывод

Операционная система

Фотографии


Rodrigo Copetti

Rodrigo Copetti

Надеюсь, вам понравилась эта статья! Если вы хотите узнать больше об авторе, нажмите сюда и если вы хотите поддержать его, то нажмите сюда

rsslinkedintwittergithub facebookreddit