Как можно запретить MMAP кэшировать значения? - PullRequest
14 голосов
/ 27 марта 2012

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

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

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

Последующие действия:

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

Ответы [ 2 ]

24 голосов
/ 27 марта 2012

Собираюсь идти дальше и сам отвечу на это своим решением.

В драйвере ядра из моей функции sysfs mmap есть макрос в /include/asm/pgtable.h, который устанавливает правильные флагидля nocache'd PFN переназначить.Это выглядит так:

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 я использовал флаг MAP_SHARED в аргументе mmap flags.

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

0 голосов
/ 27 марта 2012

Может ioremap_nocache() помочь?

...