我正在编写一个需要大内存的驱动程序。假设它至少为 1GB。内核版本 >= 3.10。驱动需要在 X86_64 和 Arm 平台上运行。硬件可能有 IOMMU。
- 这个大内存将映射到用户空间。
- 设备使用这些内存来做 DMA。每个 DMA 操作仅将最大 2KB 大小的数据写入这些内存。
我的问题。
vmalloc 可以给我很大的非物理连续页面。我可以使用 vmalloc 获得大内存来做 DMA 吗?我正在考虑使用
vmalloc_to_page
获取页面指针然后使用page_to_phys
获取物理地址。我发现了一条关于“vmalloc 性能低于 kmalloc”的信息。我不确定这意味着什么。如果我这样做
vaddr = vmalloc(2MB)
,kaddr = kmalloc(2MB)
由于内存重映射,vmalloc 的函数调用将比 kmalloc 慢。但是 [vaddr, vaddr+2MB) 范围内的内存访问会比 [kaddr, kaddr+2MB) 慢吗?驱动程序初始化时会创建大内存,那么vmalloc内存会导致性能问题吗?DMA 需要
dma_map_single
得到dma_addr_t
. 我正在考虑使用dma_map_single
在驱动程序初始化时获取所有页面的 dma 地址。当驱动程序需要进行 DMA 时,我只会使用那些 dma 地址。我可以这样做以提高性能吗?