2016-03-23 6 views
0

Я разрабатываю модуль ядра Linux, который взаимодействует с аппаратным компонентом, обращающимся к DDR, используя DMA. (Бег на руке SoC)Промывка диапазона виртуальных адресов

Что водитель по существу делает это выделить буфер (вес/kmalloc), и записать физический (используя virt_to_phys) адрес буфера для базового оборудования

При чтении буфера , старые данные, похоже, читаются, что указывает на проблему с кешем (при непосредственном контроле DDR, обход Linux, считывание новых данных).

Я не могу понять, как работает очистка или аннулирование кеша.

Каков наилучший подход?

Использование ядра 3,14

ответ

1

У вас есть 2 варианта:

  1. использовать когерентное преобразование, которое выделяет память с помощью dma_alloc_coherent

  2. использовать потоковое отображение, карта буфера для ДМА с помощью dma_map_single рассказывающие ядро направление DMA и отменить его после того, как вы закончите

+0

Спасибо. Могу ли я использовать либо методы, чтобы выделить физически смежную память? –

+0

на dma_alloc_coherent вы получаете физически непрерывный буфер памяти. Если вы используете dma_map_single, вам нужно передать ему выделенный континуум буфер (выделенный, например, с помощью kmalloc) –