Как предотвратить кэширование значений MMAP?

Я написал драйвер linux, который ioremaps экспортирует PCI BAR0 для конкретного устройства в двоичный атрибут sysfs, позволяющий пользовательскому пространству напрямую управлять им.

проблема возникает, когда я пытаюсь MMAP поверх атрибута для прямого доступа к этому биту памяти (из программы userland). Чтение выполняется отлично и возвращает ожидаемые значения, хотя когда я пишу в эту память, она, похоже, кэшируется где - то между ядром и памятью и не доставляется в GMCH корневой комплекс (и, следовательно, устройство). То, что я хотел бы сделать, это иметь неявный барьер памяти записи после каждого доступа.

  • есть ли способ предотвратить кэширование ядром записи в mmap-ed бит памяти?

дополнения:

  • называет вызовом msync() после каждого доступа "принятый" способ сделать это?

2 ответов


собираюсь идти вперед и ответить на этот вопрос сам с моим решением.

в драйвере ядра из моей функции sysfs mmap есть макрос в /include/asm / pgtable.H, который задает правильные флаги для nocache бы ПФН перекодировки. Выглядит это так:

vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
if (io_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
               vma->vm_end - vma->vm_start,
               vma->vm_page_prot))
    return -EAGAIN;

кроме того, в mmap userland я использовал флаг MAP_SHARED в аргументе mmap flags.

комбинация двух в конечном итоге сделала трюк.


Might ioremap_nocache() помочь?