Сетевой драйвер уже будет использовать DMA для ускорения передачи. Когда вы запускаете write
, ядро выделяет непрерывный блок физической памяти и копирует данные из буфера пользовательского пространства в эту память. На этом этапе ядро подключит все необходимые заголовки Ethernet и TCP / IP.
Затем ядро выдаст запрос DMA на сетевую карту, попросив его взять данные из этой физической памяти и загрузить их во внутренние буферы. В этот момент ваш write
системный вызов вернется. Когда сетевая карта завершена (и данные выходят из адаптера), сетевая карта сообщит ядру о завершении.
В Linux сетевые драйверы обычно являются однопоточными (есть некоторые исключения, но это усложняется), поэтому, если вы попытаетесь write
некоторых данных и драйвер уже активен, они все равно будут скопированы в пространство ядра, но Запрос DMA не будет выполнен, пока сетевой драйвер снова не освободится (он будет запущен, когда ядро будет в следующий раз уведомлено о завершении DMA).
Мораль этой истории состоит в том, что это уже работает и довольно быстро, вам ничего не нужно делать, чтобы ускорить работу приложения с использованием DMA, об этом уже позаботились. Единственный фрагмент, который вы могли бы ускорить, - это копия в буфере пространства ядра, но, поскольку это намного быстрее, чем фактическая передача по сети (и может выполняться одновременно), это не имеет никакого значения для пропускной способности, только для задержки.
N.B. Выше приведено грубое упрощение, если вы хотите получить более подробную информацию о конкретной части, отредактируйте свой вопрос, и я сделаю то, что могу.