CPU Cache Handling

### Обзор кэша центрального процессора

Для увеличения скорости некоторые процессоры (CPU) семейства 68k имеют возможность при доступе к памяти использовать кэш.
Кэши всегда используют логическую адресацию, включая функциональный код доступа. Это означает, что доступ в режиме пользователя (User Mode) и режиме супервайзера) Supervisor Mode будут создавать различные входные данные кэша (за дополнительной информацией обращайтесь к документации по процессорам фирмы Motorola).

вот краткий обзор особенностей кэшей процессоров семейства 68k:

- 68000 - отсутствует
- 68010
  - Команда предварительной выборки
    два слова предварительной выборки, одно слово декодирующего регистра
  - Режим Цикла
    используется когда за одним словом инструкции следует DBcc, и до окончания цикла больше нет никаких инструкций
- 68020
  - Команда предварительной выборки
    длинное слово
  - Кэш команд
    16 линий по 16 байт = 256 байт
    может быть активзирован или остановлен через CARC
- 68030
  - Команда предварительной выборки
    длинное слово
  - Кэш команд
    16 линий по 16 байт = 256 байт
    может быть активизирован или остановлен через CARC
  - Кэш данных
    16 линий по 16 байт = 256 байт
    может быть активизирован или остановлен через CARC
    всегда со сквозной записью (WriteThrough)
    выбор режима кэширования данных при записи (Write Allocation)
- 68040
  - Команда предварительной выборки
    длинное слово
  - Кэш команд
    256 линий по 16 байт = 4096 байт
    может быть активизирован через CARC
  - Кэш данных
    256 линий по 16 байт = 4096 байт
    может быть активизирован через CARC
    возможность выбора режима CopyBack/WriteThrough через MMU
- 68060
  - Команда предварительной выборки
    длинное слово
  - Кэш команд
    512 линий по 16 байт = 8192 байт
    может быть активизирован, остановлен и уменьшен в 2 раза через CARC
  - Кэш ветвления (Branch Cache)
    может быть активизирован через CARC
    не изменяется установками MMU!
  - Суперскалярная обработка (Superscalar Dispatch)
    может быть активизирован через CARC
  - Кэш данных
    512 линий по 16 байт = 8192 байт
    может быть активизирован, остановлен и уменьшен в 2 раза через CARC
    возможность выбора режима CopyBack/WriteThrough через MMU
  - Push Buffer
    может быть отключен через PCR
  - Store Buffer
    может быть активизирован через CARC
    Страницы не должны быть некэшируемыми (NonCachable Serialized (precise))

#### Работа с кэшем в WHDLoad

Первая важная вещь состоит в понимании того, что кэш процессоров 68030..68060 управляется с помощью Регистра Контроля Кэша (CACR) и MMU (при условии, что WHDLoad использует MMU и управляет им)!
С помощью CACR кэш может бать включен или выключен. Используя одну страницу памяти MMU (4 кб с WHDLoad) можно обозначить каким образом будет производиться кэширование.
На процессорах 68030 страница памяти может быть кэшируемой (Cacheable) или некэшируемой (NotCacheable). На процессорах 68040/68060 - кэшируемой WriteThrough (сквозное), CopyBack, некэшируемой NonCachable (неточно) или некэшируемой NonCachable Serialized (точно).

Если WHDLoad не использует MMU, то управление возможно только с помощью CACR.

#### Стандартные установки кэша

По умолчанию области WHDLoad, Slave и ExpMem помечены как кэшируемые CopyBack. Область BaseMem помечена как NonCachable, а кэш данных и кэш команд включены через CACR. Таким образом, если программа располагается в области BaseMem, то она запускается с отключенным кэшем, но WHDLoad и Slave используют кэш для быстродействия.

#### Управление кэшем (для программистов)

Имеется две функции в WHDLoad для управления кэшами: resload_SetCACR и resload_SetCPU. Resload_SetCACR довольно старая функция и она может быть полностью заменена с помощью resload_SetCPU (WHDLoad сам обрабатывает аргументы функции resload_SetCACR и автоматически вызывает функцию resload_SetCPU). В любом случае рекомендуется использовать функцию resload_SetCACR всем, кто плохо знаком с тем, как работать с кэшами и каково их влияния на систему Амиги. Использование функции resload_SetCACR и кэш данных, можно включать и отключать независимо друг от друга. Resload_SetCACR влияет только на кэширование области основной памяти (BaseMem).

#### Управление кэшем (для пользователей)

Если программист ответственно подошел к своей работе, то пользователю вообще не нужно ломать голову относительно установок кэша, поскольку все настройки кэша будут выполнены Slave-модулем самостоятельно.
Однако, может быть две причины для изменения установок кэша вручную. Первая - это проблемы с установленной программой, из-за того что она работает слишком быстро (например, происходит порча графики), а вторая , чтобы ускорить работу установленной программы.

Чтобы заставить работать программы, которые приводят к ошибке из-за использования кэша, нужно активизировать опцию NoCache. Эта опция выключает все кэши и помечает всю память как некэшируемую NonCachable Serialized (точно). Если компьютер имеет 32-битную Chip-память то он по прежнему будет работать быстрее чем A500.

Для того чтобы ускорить работу установленной программы, могут быть выставлены некоторые опции для активации кэша. Эти опции будут перезаписывать внутренние установки Slave-модуля. С процессорами 68020 может быть установлена опция Cache . С процессорами 68030 еще может быть использована и опция DCache, которая также включает в себя опцию управления кэшем. Для использования с процессорами 68060 существует еще несколько опций управления кэшами: BranchCache, StoreBuffer и SuperScalar. Опция ChipNoCache/S может увеличить производительность на процессорах 68040 и 68060 (см. ниже).

#### Кэширование чип-памяти (Chip-Memory)

Кэширование может производиться не только средствами самого процессора (CACR) и MMU, а так же и внешними аппаратными средствами. Процессор по шине передаёт сигнал в случае, если он пытается кэшировать доступ. И внешние аппаратные средства могут сигнализировать процессору (после того как адрес был выставлен на шине адреса во время доступа к памяти), что доступ не должен кэшироваться.
На сколько мне известно, на всех Амигах и внешних акселераторах, содержащих процессор не ниже 68030 (т.к. они имеют кэш данных), аппаратные средства сообщают процессору, что память не кэшируется или не используется. Воздействие происходит на всю Chip-память и область IO (Cia/Custom/RTC) которые не должны кэшироваться кэшем данных. Это необходимо для того, чтобы избежать конфликтов, например, из-за работы DMA.
Реакция процессора на аппаратный отказ кэширования доступа может отличаться на разных типах процессоров. На 68030 нет никакого влияния на скорость доступа, данные просто не будут кэшироваться. На 68040 доступ на чтение будет выполняться с максимальной скоростью, но доступ на запись (CopyBack) будет отменен и начат сначала без кэширования, что приводит к тому, что доступ будет примерно в 5 раз (зависит от аппаратных средств и скорости процессора) медленнее по сравнению с некэшируемым доступом. На 68060 доступ как на чтение, так и на запись будет отменен и перезапущен. Доступ на чтение будет примерно в 3 раза медленнее, а доступ на запись медленнее примерно в 5 раз.
Упомянутые выше проблемы связаны с доступом к данным. Доступ к командам обычно не вызывает проблем и также кэшируется в Chip-памяти. Но существуют некоторые аппаратные средства (возможно, просто неисправные), которые не позволяют кэширование команд в Chip-памяти. На таких системах должна использоваться опция ChipNoCache/S, чтобы избежать значительного замедления в работе установленной программы, поскольку иначе (без использования этой опции) доступ к инструкциям будет примерно в 2 раза медленнее.

Вы можете проверить поведение вашего компьютера на этот предмет путем запуска модуля Speed.Slave, находящегося в директории `src/memory-speed` архива для разработчиков.

#### Кэширования данных при записи (Write Allocation)

Кэширование данных при записи управляет работой кэша на процессорах 68030 когда при операции записи происходит потеря кэша. Кэширование данных при записи должно быть активизировано, когда программа запущена в режиме пользователя (User Mode). Если установленная программа запускается только в режиме супервайзера (Supervisor Mode), то Кэширование данных при записи может быть отключено, что может дать небольшой прирост скорости.

#### Кэш ветвления (Branch Cache)

Кэш ветвления доступен только на 68060. Это своего рода кэш инструкций для команд перехода. Но в отличие от кэша команд не зависит от установок MMU! Это означает, что даже если страница памяти помечается как не кэшируемая, команды перехода все равно будут кэшироваться при условии, что кэш ветвления активен.

За дополнительной информацией обращайтесь к справочнику по микропроцессорам Motorola. Если у вас есть поправки или добавления которые хотелось бы видеть на этой странице, пожалуйста напишите мне .