如何将 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想要虚拟映射它,以下是选项。
- 在驱动程序中使用 dma_mmap_attr() 你必须使用 .map = map_user_space_function()
然后在该函数中使用 dma_mmap_attr() ,它将映射到用户 space 虚拟内存。
- 在驱动程序中使用 get_vm_area() 并使用 dma_mmap_attr(),其中使用了 get_vm_area() 的 vm_area return。
我想使用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想要虚拟映射它,以下是选项。
- 在驱动程序中使用 dma_mmap_attr() 你必须使用 .map = map_user_space_function() 然后在该函数中使用 dma_mmap_attr() ,它将映射到用户 space 虚拟内存。
- 在驱动程序中使用 get_vm_area() 并使用 dma_mmap_attr(),其中使用了 get_vm_area() 的 vm_area return。