У меня есть устройство с ARM, на нём есть аппаратный блок с собственной памятью, доступной CPU.
Эта память физически лежит отдельно от системной памяти, вместе с регистрами этого и других устройств.
Я написал драйвер, который на вызов mmap для файла устройства отображает части этой собственной памяти в вызывающий процесс с помощью remap_pfn_range со включенным кешированием.
Возник вопрос: как сбрасывать/инвалидировать кеш CPU в процессе обмена данными с устройством через эту память.
DMA API не подходит, потому что область физических адресов, через которую доступна эта память не покрыта структурами struct page.
Я порылся в ядре и не нашёл ни одного драйвера, который бы отображал память устройства в процесс со включённым кешированием.
Правильно ли я понимаю, что это линуксом не поддерживается?
Какими функциями пользоваться если всё-таки надо?
Нет, по двум причинам:
- во-первых кеширование в этом мэппинге не write-through, а write-back. Так сделано для повышения производительности, чтобы приложение не тормозило при записи в память устройства.
- даже если кеширование перевести в режим write-through нужно инвалидировать кеш, когда устройство изменяет данные со своей стороны.
Обе эти задачи традиционно решаются с помощью вызовов dma_sync_single_for_device и dma_sync_single_for_cpu, которые мне недоступны.
Олег Цилюрик: а... ну с теми вопросами всё уже ясно.
Но горя-то никакого нет. Есть интересные вопросы, на которые никто вокруг почему-то не может или не хочет ответить.