Преамбула. Есть устройство, с какими-то физ. адресами на PCI-E. Есть большое желание из юзерлендного приложения работать с устройством напрямую, прямо писать/читать регистры (не говорите, что плохо, это надо, гигабайты в сек.), передавать данные из юзерспейса в кернел и обратно без лишних copy_to_user/copy_from_user, вызовов ioctl и т.п..
Для этого драйвер создает устройство «/dev/mydev», которое реализует функции struct file_operations : .open, .release, .unlocked_ioctl, .compat_ioctl и .mmap. Приложение открывает устройство «/dev/mydev» и все функции работают нормально, в dmesg видна печать, но не .mmap. Туда управление просто не попадает.
Вот, примерный аналог того, что я пытаюсь сделать https://www.sobyte.net/post/2022-03/mmap/
Не приходит в модуль mmap. Я делал драйвер в «/dev/» символьным устройством, miscdevice, осталось только блочным (ну символьное то не имеет конечного размера и lseek и mmap ему по логике не нужны). Я пробовал замапить «/dev/sda» в память - неа.
Раньше я через mmap мапил известные (lsusb) физ. адреса PCI карты через «/dev/mem», могу дать пример. Но тут надо без «/dev/mem», со своим устройством, чтобы оно мапило свою память.
Upd1. Да, и драйвер выделяет непрерывную физ.память/вирт.память.ядра через kmalloc, а лучше как сейчас через alloc_pages. Их будет юзать DMA.