Почему область памяти помечается как некэшируемая?

StackOverflow https://stackoverflow.com/questions/90204

  •  01-07-2019
  •  | 
  •  

Вопрос

Во встроенном приложении у нас есть таблица, описывающая различные диапазоны адресов, действительные на нашей целевой плате.Эта таблица используется для настройки MMU.
Диапазон адресов ОЗУ помечен как кэшируемый, но другие регионы помечены как некэшируемые.Почему это?

Это было полезно?

Решение

Если к области памяти осуществляется доступ как аппаратному, так и программному обеспечению одновременно (НАПРИМЕР:регистр конфигурации оборудования или список сбора данных для DMA), этот регион должен быть определены как некэшированные.Для фактического DMA буфер памяти может быть определен как кэшированный, и в большинстве случаев желательно кэшировать буфер, чтобы обеспечить быстрый доступ к этому буферу на уровне приложения.Ответственность за очистку/аннулирование кэша перед передачей буфера в DMA или приложение лежит на драйвере.

Небольшое обновление выше должен неверно, если у нас есть специализированное оборудование, т.е.Cache Coherency Interconnect (CCI), который будет синхронизировать доступ различных аппаратных блоков к памяти.

Другие советы

Это сделано для того, чтобы процессор не использовал устаревшие значения из-за кэширования.Когда вы получаете доступ к (обычной) кэшированной оперативной памяти, процессор может «запомнить» значение, к которому вы обращались.В следующий раз, когда вы посмотрите на ту же самую ячейку памяти, процессор вернет значение, которое он запомнил, не заглядывая в ОЗУ.Это кэширование.

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

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

Любая область памяти, используемая для DMA или других аппаратных взаимодействий, не должна кэшироваться.

Возможно, он используется для ввода-вывода с отображением в памяти?

Некоторые области, такие как Flash, могут быть прочитаны за один цикл, поэтому их не нужно кэшировать.

Современные контроллеры могут использовать кэш L2 для DMA, то есть они сохраняют согласованность области кэшированной памяти, используемой для доступа по DMA.Это также называется «отслеживаемыми транзакциями памяти», выполняемыми контроллером (через DMA).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top