Отобразить несколько буферов ядра в непрерывный буфер пространства пользователя? - PullRequest
2 голосов
/ 22 января 2020

Я выделил несколько доступных для ядра буферов, используя 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);

Я не Я действительно уверен, что лучший способ отобразить несколько буферов ядра в непрерывную память пользовательского пространства, но у меня есть ощущение, что я делаю это неправильно. Заранее спасибо.

1 Ответ

0 голосов
/ 22 января 2020

К сожалению, единственным поддерживаемым в настоящее время методом mmap () для связной памяти DMA является макрос dma_mmap_coherent() или функция dma_mmap_attrs() (которая вызывается dma_mmap_coherent()). К сожалению, это не поддерживает разделение одного VMA по нескольким, индивидуально выделенным блокам когерентной памяти DMA.

(I sh) был поддерживаемый способ разделения mmap () VMA по нескольким выделения когерентной памяти DMA, поскольку это влияет на распределение буфера в подсистеме ядра, которую я помогаю поддерживать. Мне пришлось изменить его, чтобы выделить буфер как отдельный блок когерентной памяти DMA вместо множества блоков размером страницы.)

...