| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия |
| ram [2026/10/11 18:35] – gecko | ram [2026/10/23 17:55] (текущий) – gecko |
|---|
| При доступе через 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> |