У меня есть PCI-устройство, его драйвер для Linux и пользовательское приложение. Приложение mmap делает первый BAR устройства PCI через драйвер. Весь доступ осуществляется через 32-битные целые числа, и это важно, поскольку чтение/запись в регистр может иметь побочные эффекты (запуск операции и т. д.).
На платформах x86 это работает очень хорошо. Однако я только что перешел на платформу ARM, и у меня странное поведение:
- Чтение/запись из драйвера ведут себя корректно
- Чтение из пользовательского пространства вызывает запрос на чтение PCI размером 64 байта, который не может быть выполнен моим устройством, поскольку оно принимает только 32-битный доступ (+ я не хочу этого из-за побочных эффектов).
Я думаю, проблема в том, что mmap хочет предварительно загрузить некоторые данные и выдает эти 64 байта. Я пропустил флаг или что-то, что может отключить предварительную выборку mmap?
Моя текущая реализация mmap на стороне водителя просто
vma->vm_flags |= VM_RESERVED;
remap_pfn_range(vma,vma->vm_start, pfn, Size_UL, vma->vm_page_prot)