我的旧Linux(2.6.37)为DMA缓冲区分配了12MB(内置内存映射)。
我需要分发所有!该内存用于大区域中的DMA,但是dma_alloc_coherent()在一个请求中最多允许4MB。
因此,我的计划是在3个连续请求中向dma_alloc_coherent()请求所有12MB的内存,然后以我的方式使用该区域。但是查看dma_alloc_coherent()返回的值,我看到实际地址下降了,而内核虚拟地址却在增加!这样,最低的4MB实际地址具有最高的虚拟地址:
Virt=ff100000, Real=82000000
Virt=ff500000, Real=81c00000
Virt=ff900000, Real=81800000
我尝试对每个块进行iounmap(),然后对整个12MB区域进行ioremap(),但是收到以下警告(错误?):
错误:您的驱动程序在系统内存上调用ioremap()。这会导致ARMv6 +在架构上无法预测的行为,并且ioremap()在下一内核版本中将失败。请修复您的驱动程序。
如何修复我的驱动程序?