Почему область памяти должна быть помечена как не кэшированная? - PullRequest
11 голосов
/ 18 сентября 2008

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

Ответы [ 6 ]

15 голосов
/ 18 сентября 2008

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

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

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

5 голосов
/ 18 сентября 2008

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

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

5 голосов
/ 18 сентября 2008

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

1 голос
/ 18 сентября 2008

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

0 голосов
/ 28 июля 2014

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

0 голосов
/ 19 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...