2013-03-19 2 views
1

Мой сценарий выглядит следующим образом:Правильный способ доступа uncachable памяти в Linux

  • Один совет выступал в качестве PCIE Rootport (РП) и один совет действовал как PCIE конечной точки (EP).
  • Конечная точка PCIE экспортировала область памяти. Область памяти совместно используется между RP и EP. Всякий раз, когда нам нужно, чтобы обращался к этой области разделяемой памяти (на самом деле мы просто обращаемся к первой структуре данных управления байтами в этой области). Мы должны сделать недействительный кеш для чтения и очистки кеша после записи.
  • Я попытался объявить структуру, как показано ниже, но без кэша invalidate/flush чтение/запись не вступает в силу.

    typedef volatile struct { u32 front; u32 сзади; u32 n_msg; u32 offset; } queue_ctl_t;

Может кто-нибудь скажет мне правильный способ доступа к этой области разделяемой памяти. Мне просто интересно, как некоторые сетевые драйверы (для сетевых карт на шине PCIE) могут беспрепятственно обращаться к данным, не делая кеш-файл invalidate/flush. Любые предложения приветствуются, большое спасибо!

ответ

1

Вы должны использовать ioremap_nocache() для отображения соответствующих областей памяти и чтения/записи их с использованием функций ioread*() и iowrite*().

+0

привет, благодарю вас за ваш ответ. Проблема, безусловно, "nocache". Исходящий доступ должен использовать 'ioremap_nocache', а область входящей экспортируемой памяти должна быть назначена с помощью dma_alloc_coherent(). Еще раз спасибо! –

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