Я готовлю приложение, работающее на ARM Intel Cyclone V SoC.Мне нужно сопоставить буфер когерентной памяти DMA с пользовательским пространством.Буфер выделяется в драйвере устройства с помощью:
buf_addr = dmam_alloc_coherent(&pdev->dev, size, &dma_addr, GFP_KERNEL);
Отображение сделано правильно, и я убедился, что буфер, к которому аппаратный доступ обращается через HW-адрес dma_addr, виден для ядра через указатель buf_addr.
Затем в функции mmap драйвера устройства я делаю:
unsigned long physical = virt_to_phys(buf_addr);
unsigned long vsize = vma->vm_end - vma->vm_start;
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
remap_pfn_range(vma,vma->vm_start, physical >> PAGE_SHIFT , vsize, vma->vm_page_prot);
Приложение mmaps буфер с:
buf = mmap(NULL,buf_size,PROT_READ | PROT_WRITE, dev_file, MAP_SHARED);
Я не получаю никакой ошибкииз функции remap_pfn_range.Также приложение может получить доступ к mmapped памяти, но это не буфер, выделенный с помощью dmam_alloc_coherent .