Как отключить кеш-память в модулях ядра

В настоящее время я пытаюсь разработать драйвер для Linux, чтобы использовать пользовательский модуль, разработанный в FPGA. Для этого я использую Xilinx Zynq SoC с дистрибутивом Linux, который работает на 2 ядрах ARM, а мои модули VHDL реализованы на FPGA, но это не так важно, чтобы понять мою проблему.

Мой модуль FPGA пишет напрямую в RAM, и я хотел бы прочитать то, что он написал с драйвером, но у меня есть проблемы из-за кеш-памяти. Драйвер читает из кеша, а не из оперативной памяти, поэтому он читает старые данные.

Чтобы определить пространство памяти, в которое может записывать ПЛИС, я использую функцию kmalloc. Вы знаете, существуют ли флаги, которые я мог бы использовать для принудительного чтения из оперативной памяти вместо кеша?

Я видел 2 флага, которые могут быть тем, что я ищу, но я не совсем понимаю, что они делают:

__GFP_COLD: запрашивать страницы, хранящиеся в кеш-памяти, вместо того, чтобы пытаться возвращать страницы в кеш-памяти -> Я думаю, что это просто заставляет использовать еще не кэшированную страницу, но потом кеширует ее. Это верно?

GFP_DMA: Похоже, что то, что я искал, я читаю, это только принудительно использует часть памяти, совместимую с DMA.

Как я могу отключить кэширование массива, который я создаю с помощью kmalloc? Или хотя бы как заставить процессор читать из оперативной памяти вместо чтения из кеша?

Спасибо за помощь!

1 ответ

Решение

Я думаю, что нашел то, что искал этим утром.

Я обнаружил функцию dma_alloc_coherent(), и она, кажется, делает именно то, что я ищу.

Более подробную информацию об этой функции можно найти здесь:

https://www.kernel.org/doc/Documentation/DMA-API.txt

и здесь:

https://www.kernel.org/doc/Documentation/DMA-API-HOWTO.txt.

Другие вопросы по тегам