Содержание

RAM

Оперативная память PlayStation. Имеет объем в 2 MiB.

Пространство адресов 32-битное и отображено на несколько сегментов с разными свойствами:

Физически KUSEG/KSEG0/KSEG1 - это одна и та же память, разница лишь в том, как процессор интерпретирует доступ к ней. Различие между кэшированным и некэшированным доступом имеет значение для кэша инструкций (I-кэш) и очереди записи: доступ к памяти через KUSEG и KSEG0 использует как I-кэш, так и очередь записи, тогда как доступ к памяти через KSEG1 не использует ни то, ни другое. KSEG1 используется для устройств ввода-вывода и областей памяти, где очередь приведет к багам (например, DMA и порты CD-ROM).

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

В пользовательском режиме обращение через KSEG0 или KSEG1 вызовет исключение шины. BIOS переключает CPU в режим ядра при старте, и игры обычно его не отключают, поэтому практической разницы между доступом через KUSEG и KSEG0 нет. Обращение к любому адресу KSEG2, отличному от 0xFFFE0130, также вызовет исключение шины.

К портам ввода/вывода нужно обращаться через KSEG1. Заметим, что библиотеки Sony все же используют KUSEG для доступа к портам, записывая 4 фиктивных значения, чтобы гарантировать очистку очереди записи. Это позволяет использовать преимущества кэширования, но при этом избежать ошибок из-за отложенных записей.

Маппинг памяти

KUSEG      KSEG0      KSEG1
0x00000000 0x80000000 0xA0000000 - 2048 KiB - RAM. Первые 64 KiB зарезервированы под данные BIOS (kernel workspace)
0x1F000000 0x9F000000 0xBF000000 - 8192 KiB - Expansion Region 1
0x1F800000 0x9F800000 --         - 1 KiB    - Scratchpad
0x1F801000 0x9F801000 0xBF801000 - 8 KiB    - Порты ввода/вывода (DMA, GPU, MDEC, SPU, CD-ROM и др.)
0x1F802000 0x9F802000 0xBF802000 - 8 KiB    - Expansion Region 2
0x1FA00000 0x9FA00000 0xBFA00000 - 2048 KiB - Expansion Region 3
0x1FC00000 0x9FC00000 0xBFC00000 - 512 KiB  - BIOS ROM

KSEG2
0xFFFE0130                       - регистр контроля кэша

VRAM, звуковая память, память контроллера CD-ROM, внешние карты памяти (EEPROM) не имеют отображения в шине CPU. Обращение к ним происходит исключительно через порты ввода/вывода.

Scratchpad

Процессоры MIPS обычно имеют кэш данных (D-кэш), но в PSX вместо него используется так называемый Scratchpad, отображенный в блок памяти 0x1F800000..0x1F8003FF в KUSEG. Он используется как быстрая память и предназначен для предоставления программам гибкой системы кэширования. Ни функции BIOS, ни библиотеки Sony не занимают Scratchpad, поэтому он полностью во власти программиста. Его обычно используют для хранения промежуточных данных в разного рода вычислениях, где важна производительность чтения/записи.