Отображение физического адреса в пространство пользователя, решение проблем с кешем - PullRequest
0 голосов
/ 09 января 2020

В проекте, над которым я работаю, есть необходимость в буфере, находящемся в DDR. Этот буфер должен быть доступен как для ПО, так и для ПО (FPGA). SW выполняет некоторые вычисления для этого буфера, а затем сообщает HW адрес буфера и его размер. HW читает буфер и передает его.

Моей первой идеей было написать драйвер, который отображает некоторую скрытую область из ОС в DDR. Я скрыл этот регион, передав параметр «mem» в ОС с меньшим размером, чем реальный размер оперативной памяти. Мой драйвер действует как файл. В нем реализованы методы lseek, read и write.

Я выполнил вычисление для некоторого временного буфера, который я выделяю в пользовательском пространстве, и в конце вычислений я использовал драйвер для копирования его в ОЗУ.

Все работало хорошо.

Моему менеджеру это не понравилось. Он сказал, что я трачу время на копирование данных, а не на вычисления в буфере.

Я создал еще один буфер, на этот раз драйвер выделяет память в ядре, используя kmallo c, и затем реализуйте функцию mmap. Пространство пользователя использует функцию mmap и получает виртуальные адресные точки к физическому адресу в DDR.

Но это вызывает проблемы (и я трачу много времени, пока не понял проблему). В способе реализации второго драйвера используется кеш. Итак, буфер, который я получаю в конце вычисления, равен true, но на самом деле он не находится в DDR (часть его все еще находится в кеше). Аппарат FPGA не «знает» об этом, он читает DDR без проверки кэша, в результате получается плохая передача.

Теперь я пытаюсь подумать о своих вариантах. Первый драйвер был более безопасным, он отображал регион, «скрытый» от ОС и от другого процесса, и он также (я думаю) не включал кэш, возможно, потому что он скрыт от ОС и способа, которым я отобразил этот регион ( ioremap). Сам расчет не был таким медленным, потому что он включал кеш (для этого я использовал обычный буфер в пользовательском пространстве), единственная плохая вещь заключалась в том, что я скопировал буфер в конце. Я не знаю, есть ли способ сделать вычисления непосредственно в буфере в DDR и заставить кеш обновлять DDR в конце. Мне интересно услышать ваши мысли и предложения.

...