2

У меня есть вопрос относительно отображаемой памяти io. Предположим, имеется периферийное периферийное устройство IO с памятью, значение которого считывается процессором. После чтения значение сохраняется в кеше. Но значение в памяти было обновлено внешним периферийным периферийным устройством ввода-вывода. В таких случаях, как ЦП определяет, что кеш был признан недействительным, и каков может быть обходной путь для такого случая?Управление кэшем с отображением памяти I/O

ответ

1

Это сильно зависит от платформы. И на самом деле, есть два разных случая.

Дело № 1. Память, отображаемая на периферии. Это означает, что доступ к некоторому диапазону адресов физической памяти направляется на периферийное устройство. В действительности нет оперативной памяти. Для управления кэшированием x86, например, имеет MTRR («регистры диапазона типов памяти») и PAT («таблицы атрибутов страницы»). Они позволяют устанавливать режим кэширования в определенном диапазоне физической памяти. При нормальных обстоятельствах диапазон памяти, отображаемой в ОЗУ, равен с возможностью записи в обратную сторону, тогда как диапазон памяти, отображаемой на периферийные устройства, равен uncacheable. Различные политики кэширования описаны в Intel's system programming guide, 11.3 «Методы кэширования доступны». Таким образом, когда вы выдаете запрос на чтение или запись на периферийное устройство с отображением памяти, кеш процессора обходит, и запрос переходит непосредственно к устройству.

Корпус №2. DMA. Это позволяет периферийным устройствам получать доступ к ОЗУ асинхронно. В этом случае контроллер DMA ничем не отличается от любого ЦП и одинаково участвует в протоколе согласованности кеша. Запрос на запись с периферии рассматривается кэшами других ЦП, а строки кэша либо недействительны, либо обновляются новыми данными. Запрос на чтение также просматривается кэшами других ЦП, и данные возвращаются из кеша, а не из основной ОЗУ. (Это всего лишь пример: фактическая реализация зависит от платформы. Например, SoC обычно не гарантирует жесткую когерентность кеш-памяти < -> CPU.)

В обоих случаях проблема кэширования также существует на уровне компилятора: complier может кэшировать значения данных в регистрах. Вот почему языки программирования имеют некоторые способы запрещения такой оптимизации: например, volatile ключевое слово в C.

Смежные вопросы