====== RAM ====== Оперативная память PlayStation. Имеет объем в 2 MiB. Пространство адресов 32-битное и отображено на несколько сегментов с разными свойствами: * KUSEG - 0x00000000..0x7FFFFFFF - сегмент пользовательского режима (user mode), кэшируемый доступ; * KSEG0 - 0x80000000..0x9FFFFFFF - сегмент режима ядра (kernel mode), кэшируемый доступ; * KSEG1 - 0xA0000000..0xBFFFFFFF - сегмент режима ядра (kernel mode), некэшируемый доступ; * KSEG2 - 0xC0000000..0xFFFFFFFF - виртуальная память. В PlayStation нет виртуальной памяти, поэтому данный сегмент не применяется, за исключением адреса 0xFFFE0130, по которому находятся регистр контроля кэша. Физически KUSEG/KSEG0/KSEG1 - это одна и та же память, разница лишь в том, как процессор интерпретирует доступ к ней. Различие между кэшированным и некэшированным доступом имеет значение для кэша инструкций (I-кэш) и очереди записи: доступ к памяти через KUSEG и KSEG0 использует как I-кэш, так и очередь записи, тогда как доступ к памяти через KSEG1 не использует ни то, ни другое. KSEG1 используется для устройств ввода-вывода и областей памяти, где очередь приведет к багам (например, [[DMA]] и порты [[CD_ROM|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, поэтому он полностью во власти программиста. Его обычно используют для хранения промежуточных данных в разного рода вычислениях, где важна производительность чтения/записи.