Я пытаюсь отобразить согласованную память DMA, которую я выделил в драйвере ядра, в пространство пользователя. Там я использую mmap()
, а в драйвере ядра я использую dma_alloc_coherent()
, а затем remap_pfn_range()
для переназначения страниц.
Цель отображения памяти DMA в пространство пользователя - минимизировать доступ ioctl к ядру. Хост должен выполнить довольно большое количество последовательных обращений к памяти DMA, и я хочу получить к нему доступ непосредственно в пространстве пользователя, а не тратить время, используя бесчисленные операции ioctl()
.
mmap()
возвращает EPERM (1) - Операция не разрешена .
Я нашел это сообщение: mmap: Операция не разрешена
Ответ:
Звучит так, как будто ядро скомпилировано с CONFIG_STRICT_DEVMEM
включен. Это функция безопасности для предотвращения доступа пользователя к
(возможно, чувствительная) физическая память выше 1 МБ (IIRC). Вы, возможно
возможность отключить это с помощью sysctl dev.mem.restricted.
Это единственная полезная информация, которую я нашел. Тем не менее, я вижу 2 вопроса:
1) Я выделил для тестирования только 4k. Согласно приведенному выше утверждению, только физическая память> 1 МБ должна быть проблемой. Я все еще не могу mmap (во всяком случае, для окончательного драйвера мне потребуется гораздо больше памяти dma, но перекомпиляция ядра не может быть решением моей проблемы), что приводит меня к 2)
2) Кроме того, перекомпиляция ядра не возможна, поскольку драйвер должен работать без специальной настройки ядра.
Есть идеи по этому поводу? Я ценю помощь.
Я использую Ubuntu 16.04.1 , ядро: 4.10.0-40-generic
РЕДАКТИРОВАТЬ: РЕШЕНО
Я сделал ошибку копирования-вставки, в результате чего ret = -1. Таким образом, функция .mmap в драйвере ядра, которая вызывает remap_pfn_range, возвращает -1 вместо 0. Это привело к сбою mmap () в пользовательском пространстве