Я пишу код драйвера для чтения и записи с периферийного устройства AXI LITE.Поскольку AXI LITE является интерфейсом с отображением памяти, я реализую функцию mmap в своем коде драйвера.Я делаю некоторый эксперимент,
- выделяя память с помощью API dma_alloc_coherent () и затем сопоставляя ее с пользовательским пространством с помощью API dma_mmap_cohernet () {повышая производительность}.
- Яотображение памяти в пространство пользователя с помощью API remap_pfn_range () вместе с API pgprot_noncached (), чтобы избежать проблемы кэширования {из-за низкой производительности}.
Я вижу лучшую производительность при чтении и записи в случаеdma_alloc_coherent () сравнивать с remap_pfn_range ().Но если я удаляю pgprot_noncached () из кода, то производительность памяти, отображаемая с помощью remap_pfn_range, также улучшается, но я вижу несоответствие данных из-за проблемы кэширования.
{обеспечить лучшую производительность}
virt = dmam_alloc_coherent(dev,size, &phys, GFP_KERNEL);
dma_mmap_coherent(dev, vma, virt, phys, size);
2. {обеспечить плохую производительность}
vma->vm_flags |= VM_IO | VM_DONTDUMP;
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
remap_pfn_range(vma, vma->vm_start, mem->start,>>PAGE_SHIFT, size, vma>vm_page_prot);
Мои сомнения: -
Я не могу понять, почему происходит падение производительности в случае dma_alloc_coherent?
Я предполагаю, что dma_alloc_coherent по умолчанию дает не кэшированную память, в то время как в другом случае мы делаемпамять не кэшируется явно с помощью API pgprot_noncahced ().выполняет ли pgprot_noncached () API некоторую операцию или перевод памяти, что приводит к дополнительным расходам?