1

我正在编写一个需要大内存的驱动程序。假设它至少为 1GB。内核版本 >= 3.10。驱动需要在 X86_64 和 Arm 平台上运行。硬件可能有 IOMMU。

  1. 这个大内存将映射到用户空间。
  2. 设备使用这些内存来做 DMA。每个 DMA 操作仅将最大 2KB 大小的数据写入这些内存。

我的问题。

  1. vmalloc 可以给我很大的非物理连续页面。我可以使用 vmalloc 获得大内存来做 DMA 吗?我正在考虑使用vmalloc_to_page获取页面指针然后使用page_to_phys获取物理地址。

  2. 我发现了一条关于“vmalloc 性能低于 kmalloc”的信息。我不确定这意味着什么。如果我这样做vaddr = vmalloc(2MB)kaddr = kmalloc(2MB)由于内存重映射,vmalloc 的函数调用将比 kmalloc 慢。但是 [vaddr, vaddr+2MB) 范围内的内存访问会比 [kaddr, kaddr+2MB) 慢吗?驱动程序初始化时会创建大内存,那么vmalloc内存会导致性能问题吗?

  3. DMA 需要dma_map_single得到dma_addr_t. 我正在考虑使用dma_map_single在驱动程序初始化时获取所有页面的 dma 地址。当驱动程序需要进行 DMA 时,我只会使用那些 dma 地址。我可以这样做以提高性能吗?

4

0 回答 0