| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия |
| ram [2026/10/11 10:05] – 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 не использует ни то, ни другое. | Физически KUSEG/KSEG0/KSEG1 - это одна и та же память, разница лишь в том, как процессор интерпретирует доступ к ней. Различие между кэшированным и некэшированным доступом имеет значение для кэша инструкций (I-кэш) и очереди записи: доступ к памяти через KUSEG и KSEG0 использует как I-кэш, так и очередь записи, тогда как доступ к памяти через KSEG1 не использует ни то, ни другое. |
| При доступе через KUSEG и KSEG0 процессор использует сквозную очередь записи глубиной 4 слова, что позволяет снизить нагрузку на шину. Данные уходят в очередь, и процессор сразу продолжает выполнять следующие инструкции, не дожидаясь, пока шина физически осуществит запись. Для портов оборудования это критично: команда может выполниться позже, чем CPU начнет выполнять следующую. Поэтому для работы с портами ввода/вывода нужно либо обращаться через KSEG1 (в этом случае процессор будет каждый раз ждать завершения записи), либо грамотно расставлять слоты задержки. | При доступе через KUSEG и KSEG0 процессор использует сквозную очередь записи глубиной 4 слова, что позволяет снизить нагрузку на шину. Данные уходят в очередь, и процессор сразу продолжает выполнять следующие инструкции, не дожидаясь, пока шина физически осуществит запись. Для портов оборудования это критично: команда может выполниться позже, чем CPU начнет выполнять следующую. Поэтому для работы с портами ввода/вывода нужно либо обращаться через KSEG1 (в этом случае процессор будет каждый раз ждать завершения записи), либо грамотно расставлять слоты задержки. |
| |
| Заметим, что большинство SDK, включая библиотеки PsyQ, используют KUSEG для доступа к GP0/GP1, так как это особый случай. [[GPU]] работает асинхронно и имеет собственную аппаратную очередь команд. Когда процессор отправляет команды, они не выполняются мгновенно, а заносятся в очередь, и было бы неэффективно заставлять процессор ждать завершения записи каждого слова - пока шина пишет одно слово, CPU готовит следующее. Поскольку порт GP0 работает исключительно на запись, здесь не возникает классической проблемы read-after-write hazard, когда CPU записал значение в порт и тут же попытался его прочитать, получив старое значение из-за задержки шины. | Заметим, что большинство 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, также вызовет исключение шины. |
| Исполняемый код лучше всего адресовать только через KUSEG. | Исполняемый код лучше всего адресовать только через KUSEG. |
| |
| ===== Маппинг памяти ===== | ===== Карта распределения памяти ===== |
| |
| <code> | <code> |