Как отключить кеш-память в модулях ядра
В настоящее время я пытаюсь разработать драйвер для 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
и здесь: