2015-01-30 3 views
1

В моем коде есть отображение режима пользователя (настроено через mmap()), которое мне нужно скрыть после его записи из ЦП, но перед отправкой данных по DMA'у лежащей в основе физической памяти. Также мне нужно сделать недействительным кеш после того, как данные прибыли через DMA в базовую физическую память, но прежде чем я попытаюсь прочитать его с помощью CPU.Поведение Linux flush_cache_range()

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

Однако в ядре я не нахожу два вызова, а вместо этого один: flush_cache_range().

Это API, который я использую для обеих задач, и он «кажется, работает» ... по крайней мере, до текущей проблемы, которую я пытаюсь отлаживать.

Это возможно потому, что поведение flush_cache_range() просто может быть: 1) Во-первых писать любые грязные записи кэша Memory- ТОГДА 2) Invalidate все записи кэша

ПЧ это то, что этот API действительно делает, тогда мое использование этого в этой роли оправдано. В конце концов, это то, как я сам могу это реализовать. Точный вопрос, на который я требую уверенного ответа, таков:

Является ли это фактически тем, как работает flush_cache_range()?

+0

Это зависит от архитектуры системы, в которой вы работаете. x86, IIRC, кэш когерентный, поэтому команда ничего не делает. – 0andriy

+0

Linux, работающий на процессоре, может обеспечить когерентность кэша для всех операций DMA, которые он проводит (и, следовательно, знает). Однако наша карта является автономным агентом вне CPU. И если DMA в память, у которой есть записи в одном из кэшей хоста, тогда кеш будет устаревшим, и CPU не будет знать об этом. Следовательно, необходимость явного промывки кеша. – user1967844

+0

Итак, можете ли вы отметить эту часть памяти как не кэшируемую с процессора? – 0andriy

ответ

1

Независимо от того, являются ли тайники недействительными или красными, зависит от архитектуры.

Вы должны всегда использовать функции DMA Linux для правильной обработки этих проблем. Прочитано DMA-API-HOWTO.txt и DMA-API.txt.

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