| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия |
| ram [2026/08/02 22:04] – gecko | ram [2026/10/23 17:55] (текущий) – gecko |
|---|
| * KSEG0 - 0x80000000..0x9FFFFFFF - сегмент режима ядра (kernel mode), кэшируемый доступ; | * KSEG0 - 0x80000000..0x9FFFFFFF - сегмент режима ядра (kernel mode), кэшируемый доступ; |
| * KSEG1 - 0xA0000000..0xBFFFFFFF - сегмент режима ядра (kernel mode), некэшируемый доступ; | * KSEG1 - 0xA0000000..0xBFFFFFFF - сегмент режима ядра (kernel mode), некэшируемый доступ; |
| * KSEG2 - 0xC0000000..0xFFFFFFFF - виртуальная память. В PlayStation нет виртуальной памяти, поэтому данный сегмент не применяется, за исключением адреса 0xFFFE0130, по которому находятся регистр контроля кэша. | * KSEG2 - 0xC0000000..0xFFFFFFFF - виртуальная память. В PlayStation нет виртуальной памяти, поэтому данный сегмент не применяется, за исключением адреса 0xFFFE0130, по которому находится регистр контроля кэша. |
| |
| Физически KUSEG/KSEG0/KSEG1 - это одна и та же память, разница лишь в том, как процессор интерпретирует доступ к ней. Различие между кэшированным и некэшированным доступом имеет значение для кэша инструкций (I-кэш) и очереди записи: доступ к памяти через KUSEG и KSEG0 использует как I-кэш, так и очередь записи, тогда как доступ к памяти через KSEG1 не использует ни то, ни другое. KSEG1 используется для устройств ввода-вывода и областей памяти, где очередь приведет к багам (например, [[DMA]] и порты [[CD_ROM|CD-ROM]]). | Физически KUSEG/KSEG0/KSEG1 - это одна и та же память, разница лишь в том, как процессор интерпретирует доступ к ней. Различие между кэшированным и некэшированным доступом имеет значение для кэша инструкций (I-кэш) и очереди записи: доступ к памяти через KUSEG и KSEG0 использует как I-кэш, так и очередь записи, тогда как доступ к памяти через KSEG1 не использует ни то, ни другое. |
| |
| При доступе через KUSEG и KSEG0 процессор использует сквозную очередь записи глубиной 4 слова, что позволяет снизить нагрузку на шину при записи. При чтении из той же области памяти, которая только что была записана в очередь, она сначала будет очищена, а затем будет прочитана обратно. | При доступе через KUSEG и KSEG0 процессор использует сквозную очередь записи глубиной 4 слова, что позволяет снизить нагрузку на шину. Данные уходят в очередь, и процессор сразу продолжает выполнять следующие инструкции, не дожидаясь, пока шина физически осуществит запись. Для портов оборудования это критично: команда может выполниться позже, чем CPU начнет выполнять следующую. Поэтому для работы с портами ввода/вывода нужно либо обращаться через KSEG1 (в этом случае процессор будет каждый раз ждать завершения записи), либо грамотно расставлять слоты задержки. |
| | |
| | Заметим, что большинство SDK используют KUSEG для доступа к GP0/GP1, так как это особый случай. [[GPU]] работает асинхронно и имеет собственную аппаратную очередь команд. Когда процессор отправляет команды, они не выполняются мгновенно, а заносятся в очередь, и было бы неэффективно заставлять процессор ждать завершения записи каждого слова - пока шина пишет одно слово, CPU готовит следующее. Поскольку порт GP0 работает на запись, здесь не возникает классической проблемы read-after-write hazard, когда CPU записал значение в порт и тут же попытался его прочитать, получив старое значение из-за задержки шины. |
| |
| В пользовательском режиме обращение через KSEG0 или KSEG1 вызовет исключение шины. BIOS переключает CPU в режим ядра при старте, и игры обычно его не отключают, поэтому практической разницы между доступом через KUSEG и KSEG0 нет. Обращение к любому адресу KSEG2, отличному от 0xFFFE0130, также вызовет исключение шины. | В пользовательском режиме обращение через KSEG0 или KSEG1 вызовет исключение шины. BIOS переключает CPU в режим ядра при старте, и игры обычно его не отключают, поэтому практической разницы между доступом через KUSEG и KSEG0 нет. Обращение к любому адресу KSEG2, отличному от 0xFFFE0130, также вызовет исключение шины. |
| |
| К портам ввода/вывода нужно обращаться через KSEG1. Заметим, что библиотеки Sony все же используют KUSEG для доступа к портам, записывая 4 фиктивных значения, чтобы гарантировать очистку очереди записи. Это позволяет использовать преимущества кэширования, но при этом избежать ошибок из-за отложенных записей. | Исполняемый код лучше всего адресовать только через KUSEG. |
| |
| ===== Маппинг памяти ===== | ===== Карта распределения памяти ===== |
| |
| <code> | <code> |
| |
| ===== Scratchpad ===== | ===== Scratchpad ===== |
| Процессоры MIPS обычно имеют кэш данных (D-кэш), но в PSX вместо него используется так называемый Scratchpad, отображенный в блок памяти 0x1F800000..0x1F8003FF в KUSEG. Он используется как быстрая память и предназначен для предоставления программам гибкой системы кэширования. Ни функции BIOS, ни библиотеки Sony не используют Scratchpad, поэтому он полностью во власти игры. Его обычно используют для хранения промежуточных данных в разного рода вычислениях, где важна производительность чтения/записи. | Процессоры MIPS обычно имеют кэш данных (D-кэш), но в PSX вместо него используется так называемый [[Scratchpad]], отображенный в область памяти 0x1F800000..0x1F8003FF в KUSEG. Он используется как быстрая память и предназначен для предоставления программам гибкой системы кэширования. Ни функции BIOS, ни библиотеки Sony не используют Scratchpad, поэтому он полностью во власти игры. Его обычно используют для хранения промежуточных данных в разного рода вычислениях, где важна производительность чтения/записи. |
| |
| |