繁体   English   中英

如何在DMA_ATTR_NO_KERNEL_MAPPING中使用dma_alloc_attr()?

[英]How do I use dma_alloc_attr() with DMA_ATTR_NO_KERNEL_MAPPING?

我想使用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调用来请求内存分配,然后在系统重新引导时发生内核恐慌。

如何使用ioctl将DMA_ATTR_NO_KERNEL_MAPPING用于用户空间分配?

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

如果在dma_alloc_attr()中使用了DMA_ATTR_NO_KERNEL_MAPPING,则意味着您不希望为分配的区域进行虚拟映射。 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()(其中使用了get_vm_area()返回的vm_area)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM