Я реализую 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;
Когда я записываю эти addrs на мое устройство DMA, никакие данные не перемещаются - и когда я пытаюсь mmap на эти addrs из / dev / mem, они приводят к неверным указателям (segfaults при чтении).
Как мне получить эти адреса для выделенной памяти?