В проекте, над которым я работаю, есть необходимость в буфере, находящемся в DDR. Этот буфер должен быть доступен как для ПО, так и для ПО (FPGA). SW выполняет некоторые вычисления для этого буфера, а затем сообщает HW адрес буфера и его размер. HW читает буфер и передает его.
Моей первой идеей было написать драйвер, который отображает некоторую скрытую область из ОС в DDR. Я скрыл этот регион, передав параметр «mem» в ОС с меньшим размером, чем реальный размер оперативной памяти. Мой драйвер действует как файл. В нем реализованы методы lseek, read и write.
Я выполнил вычисление для некоторого временного буфера, который я выделяю в пользовательском пространстве, и в конце вычислений я использовал драйвер для копирования его в ОЗУ.
Все работало хорошо.
Моему менеджеру это не понравилось. Он сказал, что я трачу время на копирование данных, а не на вычисления в буфере.
Я создал еще один буфер, на этот раз драйвер выделяет память в ядре, используя kmallo c, и затем реализуйте функцию mmap. Пространство пользователя использует функцию mmap и получает виртуальные адресные точки к физическому адресу в DDR.
Но это вызывает проблемы (и я трачу много времени, пока не понял проблему). В способе реализации второго драйвера используется кеш. Итак, буфер, который я получаю в конце вычисления, равен true, но на самом деле он не находится в DDR (часть его все еще находится в кеше). Аппарат FPGA не «знает» об этом, он читает DDR без проверки кэша, в результате получается плохая передача.
Теперь я пытаюсь подумать о своих вариантах. Первый драйвер был более безопасным, он отображал регион, «скрытый» от ОС и от другого процесса, и он также (я думаю) не включал кэш, возможно, потому что он скрыт от ОС и способа, которым я отобразил этот регион ( ioremap). Сам расчет не был таким медленным, потому что он включал кеш (для этого я использовал обычный буфер в пользовательском пространстве), единственная плохая вещь заключалась в том, что я скопировал буфер в конце. Я не знаю, есть ли способ сделать вычисления непосредственно в буфере в DDR и заставить кеш обновлять DDR в конце. Мне интересно услышать ваши мысли и предложения.