为ARM64 Linux设备驱动程序分配物理内存缓冲区(不支持DMA)

时间:2015-09-03 17:09:07

标签: linux-kernel linux-device-driver embedded-linux

我必须为需要使用物理内存缓冲区并且不支持DMA(也不支持IOMMU)的设备实现ARM64 Linux驱动程序。

我的第一次尝试是使用 kmalloc 分配缓冲区,使用驱动程序中返回的 vaddr 虚拟地址并发送 paddr 物理地址在 virt_to_phys(vaddr)转换为设备后获得。我理解(一般情况下)这不是最好的方法,因为设备可能只知道其总线特定的地址。但我的问题是 virt_to_phys(vaddr)返回的 paddr 地址与 vaddr ,因此设备也无法使用它( virt_to_phys 值看起来像真实物理地址的移位版本。)

对我有用的是使用DMA映射API(例如 dma_alloc_coherent ),但我不确定这是否是最好的方法,因为设备模块不支持DMA。

另一个选择是预先分配一个内存范围(例如在设备树文件中使用保留内存节点)和 ioremap 在驱动程序中,但我不确定如果那也没关系。一些缓冲区只需要临时(当设备处理命令时),它们的大小是可变的(可能会变得非常大)。因此,在这种情况下,动态分配可能会更好。

知道这种情况下最好的内存管理方法(实践)是什么?另外,为什么通过 kmalloc 地址调用的 virt_to_phys 不会返回正确的物理地址?

感谢任何帮助。

0 个答案:

没有答案