我正在通过内存映射寄存器实现DMA,并且需要用于传递给DMA设备的缓冲区的物理地址。
我使用内核模块分配内存,然后将物理地址传递给驱动DMA的用户空间应用程序。我尝试了是否使用Page Shift。
float* buffer = (float*) kcalloc(512, sizeof(float), GFP_DMA); //allocate physical memory for DMA
unsigned long physAddr = virt_to_phys(buffer) >> PAGE_SHIFT;
当我将这些地址添加到DMA设备时,没有数据移动-当我尝试从/ dev / mem映射到这些地址时,它们将导致无效的指针(读取段错误)。
我应该如何获取分配的内存的这些地址?