Я выделил несколько доступных для ядра буферов, используя dma_alloc_coherent
, каждый размером 4MiB. Цель состоит в том, чтобы отобразить эти буферы в непрерывную виртуальную память пространства пользователя. Проблема в том, что remap_pfn_range
, похоже, не работает, так как память пользовательского пространства иногда работает, а иногда нет, или иногда дублирует отображения страниц буферов.
// in probe() function
dma_alloc_coherent(&pcie->dev, BUF_SIZE, &bus_addr0, GFP_KERNEL);
dma_alloc_coherent(&pcie->dev, BUF_SIZE, &bus_addr1, GFP_KERNEL);
// ...
// in mmap() function
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
pfn = dma_to_phys(&pcie->dev, &bus_addr0) >> PAGE_SHIFT;
remap_pfn_range(pfn, vma->vm_start + 0, pfn, BUF_SIZE, vma->vm_page_prot);
pfn = dma_to_phys(&pcie->dev, &bus_addr1) >> PAGE_SHIFT;
remap_pfn_range(pfn, vma->vm_start + BUF_SIZE, pfn, BUF_SIZE, vma->vm_page_prot);
Я не Я действительно уверен, что лучший способ отобразить несколько буферов ядра в непрерывную память пользовательского пространства, но у меня есть ощущение, что я делаю это неправильно. Заранее спасибо.