Я хочу использовать 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
. Это правильно?