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