如何将 dma_alloc_attr() 与 DMA_ATTR_NO_KERNEL_MAPPING 一起使用?

How do I use dma_alloc_attr() with DMA_ATTR_NO_KERNEL_MAPPING?

我想使用DMA_ATTR_NO_KERNEL_MAPPING进行内存分配。根据 the kernel documentation,我必须使用 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);

}

我正在使用来自用户 space 的 ioctl 调用请求内存分配,然后在系统重新启动时发生内核崩溃。

如何使用 ioctl 为用户 space 分配 DMA_ATTR_NO_KERNEL_MAPPING

在我的示例驱动程序代码中,我声明了 struct vm_area_struct *vma。对吗?

如果你在dma_alloc_attr()中使用了DMA_ATTR_NO_KERNEL_MAPPING,这意味着你不想为分配的区域进行虚拟映射。 DMA_ATTR_NO_KERNEL_MAPPING 仅再次用于映射到用户 space 内存,没有直接 api 将其映射到内核 space 内存。

如果用户space想要虚拟映射它,以下是选项。

  1. 在驱动程序中使用 dma_mmap_attr() 你必须使用 .map = map_user_space_function() 然后在该函数中使用 dma_mmap_attr() ,它将映射到用户 space 虚拟内存。
  2. 在驱动程序中使用 get_vm_area() 并使用 dma_mmap_attr(),其中使用了 get_vm_area() 的 vm_area return。