Посмотрите внимательно на драйверы Infiniband. Они прилагают много усилий, чтобы заставить работать DMA с нулевым копированием и RDMA в пользовательском пространстве.
Я забыл добавить это перед сохранением:
Выполнение DMA непосредственно в отображениях памяти пользовательского пространства полно проблем, поэтому, если у вас нет очень высоких требований к производительности, таких как Infiniband или 10 Gb Ethernet, не делайте этого. Вместо этого скопируйте данные DMA в буферы пользовательского пространства. Это избавит вас от многих проблем.
Для примера, что если программа пользователя завершается до завершения DMA? Что если после выхода пользовательская память будет перераспределена другому процессу, но аппаратное обеспечение все еще настроено на DMA в этой странице? Катастрофа!
Ну, если у вас есть LDD, вы можете заглянуть в главу 15, а точнее на страницу 435, где описаны операции прямого ввода-вывода.
Вызов ядра, который поможет вам достичь этого, это get_user_pages
. В вашем случае, поскольку вы хотите отправить данные из ядра в пользовательское пространство, вы должны установить флаг записи в 1.
Имейте также в виду, что асинхронный ввод/вывод может позволить вам достичь тех же результатов, но при этом вашему приложению пользовательского пространства не придется ждать завершения чтения, что может быть лучше.