Как я могу использовать dma_alloc_attr () с DMA_ATTR_NO_KERNEL_MAPPING? - PullRequest
1 голос
/ 14 июня 2019

Я хочу использовать DMA_ATTR_NO_KERNEL_MAPPING для выделения памяти. Согласно документации ядра , я должен использовать dma_mmap_attrs(), но в качестве одного из аргументов требуется struct vm_area_struct. Как я могу использовать это?

dma_addr_t phys;
void *virt;
void *tmp_virt;
struct vm_area_struct *vma;

pr_debug("pmap: cma: request to alloc %s for size 0x%08x\n",
         info->name, info->size);

if(strcmp(info->name,"video") == 0)
{
    pr_debug("video allocation.....\n");
    tmp_virt = dma_alloc_attrs(pmap_device, info->size, &phys, GFP_KERNEL,
                        DMA_ATTR_NO_KERNEL_MAPPING | DMA_ATTR_FORCE_CONTIGUOUS);

    virt = dma_mmap_attrs(pmap_device, vma, tmp_virt, &phys, info->size,
                        DMA_ATTR_NO_KERNEL_MAPPING | DMA_ATTR_FORCE_CONTIGUOUS);

}

Я запрашиваю выделение памяти с помощью вызова ioctl из пространства пользователя, и затем происходит перезагрузка ядра при перезагрузке системы.

Как использовать DMA_ATTR_NO_KERNEL_MAPPING для распределения пространства пользователя с помощью ioctl?

В моем примере кода драйвера я объявляю struct vm_area_struct *vma. Это правильно?

1 Ответ

0 голосов
/ 23 июля 2019

если вы использовали DMA_ATTR_NO_KERNEL_MAPPING в dma_alloc_attr (), это означает, что вам не нужно виртуальное отображение для выделенной области. DMA_ATTR_NO_KERNEL_MAPPING снова используется только для сопоставления с памятью пространства пользователя, нет прямого API для сопоставления его с памятью пространства ядра.

, если пользовательское пространство хочет отобразить его виртуально, ниже приведены варианты.

  1. Используйте dma_mmap_attr () в драйвере, который вы должны использовать .map = map_user_space_function () и затем используйте dma_mmap_attr () в этой функции, она будет сопоставлена ​​с виртуальной памятью пространства пользователя.
  2. Используйте get_vm_area () в драйвере и используйте dma_mmap_attr (), в котором используется vm_area, возвращаемая get_vm_area ().
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...